Java使用opencsv完成对csv批量操作

news2025/1/21 11:24:29

文章目录

  • 前言
  • 一、maven
  • 二、造数
  • 三、代码部分
    • 1.OpenCsvController
    • 2.OpenCsvUtil
    • 3.StudentInfo
    • 4.CodeToValue
  • 三、效果展示
    • 1.download
    • 2.upload
  • 总结


前言

csv文件是不同于excel文件的另一种文件,常常以,作为分隔符,本篇将通过JavaBean的形式完成对csv文件的读取和写出等,包含了对日期类型和码值类型数据的处理替换,真正做到稍微修改即可用。


一、maven

<!-- https://mvnrepository.com/artifact/com.opencsv/opencsv -->
		<dependency>
			<groupId>com.opencsv</groupId>
			<artifactId>opencsv</artifactId>
			<version>5.7.1</version>
		</dependency>

二、造数

数据的话我数据库里有了,这个步骤我就跳过了
在这里插入图片描述

三、代码部分

1.OpenCsvController

@RestController
@RequestMapping("opencsv")
public class OpenCsvController {
    @Autowired
    private StudentInfoService studentInfoService;
    @GetMapping("/download")
    public void download(HttpServletResponse response) throws IOException {
        //List<List<Map<String, Object>>> testsp = testService.testsp();
        // 响应正文
        response.reset();
        response.setContentType("application/octet-stream");
        // 这里URLEncoder.encode可以防止中文乱码
        response.setHeader("Content-disposition", "attachment;filename=t_student_info.csv");
        StudentInfoExample studentInfoExample = new StudentInfoExample();
        studentInfoExample.setOrderByClause("CAST(id AS SIGNED)");
        List<StudentInfo> studentInfos = studentInfoService.selectByExample(studentInfoExample);
        OpenCsvUtil.beanToCsv(new OutputStreamWriter(response.getOutputStream(),"GBK"),studentInfos);
    }
    @RequestMapping("/upload")
    public void upload(MultipartFile file) throws IOException {
        OpenCsvUtil.csvToBean(file);
    }
}

2.OpenCsvUtil

public class OpenCsvUtil {
    public static void beanToCsv(Writer writer, List list) {
        CSVWriter csvWriter = null;
        try {
            csvWriter = new CSVWriter(
                    writer,
                    CSVWriter.DEFAULT_SEPARATOR,
                    CSVWriter.NO_QUOTE_CHARACTER,
                    CSVWriter.NO_ESCAPE_CHARACTER,
                    CSVWriter.DEFAULT_LINE_END
            );
            // 映射策略
            /*有序的,自己组织头*/
//            String []header=new String[] {"学号","姓名","年龄","出生日期","民族","证件类型","证件号码","手机号","入学时间","家庭住址","院系","专业","班级","辅导员","是否在籍"};
//            String []mapping=new String[] {"id","name","age","birthday","nation","idType","idNumber","tel","admissionTime","address","faculty","major","classID","instructor","registered"};
//            mappingStrategy.setColumnMapping(mapping);
//            csvWriter.writeNext(header);
//            ColumnPositionMappingStrategy <StudentInfo> mappingStrategy = new ColumnPositionMappingStrategy();
            /*无序的,头从注解中获取*/
            HeaderColumnNameMappingStrategy<StudentInfo> mappingStrategy = new HeaderColumnNameMappingStrategy();
            mappingStrategy.setType(StudentInfo.class);
            mappingStrategy.generateHeader((StudentInfo)list.get(0));
            StatefulBeanToCsv<StudentInfo> statefulBeanToCsv = new StatefulBeanToCsvBuilder<StudentInfo>(csvWriter).withMappingStrategy(mappingStrategy).build();
            statefulBeanToCsv.write(list);
        } catch (CsvRequiredFieldEmptyException e) {
            throw new RuntimeException(e);
        } catch (CsvDataTypeMismatchException e) {
            throw new RuntimeException(e);
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void csvToBean(MultipartFile file) {
        CSVReader reader = null;
        try {
            reader = new CSVReader(new InputStreamReader(file.getInputStream(), "GBK"));
            HeaderColumnNameMappingStrategy<StudentInfo> mappingStrategy = new HeaderColumnNameMappingStrategy();
            mappingStrategy.setType(StudentInfo.class);
            CsvToBean<StudentInfo> build = new CsvToBeanBuilder<StudentInfo>(reader)
                    .withType(StudentInfo.class)
                    .build();
            build.setMappingStrategy(mappingStrategy);
            List<StudentInfo> beans = build.parse();
            beans.forEach(System.out::println);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

3.StudentInfo

public class StudentInfo implements Serializable {

	private static final long serialVersionUID = 1L;
	
		
	/** 学号 **/
	@ApiModelProperty(value = "学号")
	@CsvBindByName(column="学号")
	@CsvBindByPosition(position = 0)
	private String id;
		
	/** 姓名 **/
	@ApiModelProperty(value = "姓名")
	@CsvBindByName(column="姓名")
	@CsvBindByPosition(position = 1)
	private String name;
		
	/** 年龄 **/
	@ApiModelProperty(value = "年龄")
	@CsvBindByName(column="年龄")
	@CsvBindByPosition(position = 2)
	private Integer age;
		
	/** 出生日期 **/
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
	@ApiModelProperty(value = "出生日期")
	@CsvBindByName(column="出生日期")
	@CsvDate("yyyy年MM月dd日")
	private Date birthday;
		
	/** 民族 **/
	@ApiModelProperty(value = "民族")
	@CsvBindByName(column="民族")
	private String nation;
		
	/** 证件类型 **/
	@ApiModelProperty(value = "证件类型")
	@CsvBindByName(column="证件类型")
	private String idType;
		
	/** 证件号码 **/
	@ApiModelProperty(value = "证件号码")
	@CsvBindByName(column="证件号码")
	private String idNumber;
		
	/** 手机号 **/
	@ApiModelProperty(value = "手机号")
	@CsvBindByName(column="手机号")
	private Integer tel;
		
	/** 入学时间 **/
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
	@ApiModelProperty(value = "入学时间")
	@CsvDate("yyyy年MM月dd日 HH:mm:ss")
	@CsvBindByName(column="入学时间")
	private Date admissionTime;
		
	/** 家庭住址 **/
	@ApiModelProperty(value = "家庭住址")
	@CsvBindByName(column="家庭住址")
	private String address;
		
	/** 院系 **/
	@ApiModelProperty(value = "院系")
	@CsvBindByName(column="院系")
	private String faculty;
		
	/** 专业 **/
	@ApiModelProperty(value = "专业")
	@CsvBindByName(column="专业")
	private String major;
		
	/** 班级 **/
	@ApiModelProperty(value = "班级")
	@CsvBindByName(column="班级")
	private Integer classID;
		
	/** 辅导员 **/
	@ApiModelProperty(value = "辅导员")
	@CsvBindByName(column="辅导员")
	private String instructor;
		
	/** 是否在籍(0:否;1:是) **/
	@ApiModelProperty(value = "是否在籍(0:否;1:是)")
	@CsvCustomBindByName(column="是否在籍",converter = CodeToValue.class)
	private Character registered;

	/** 分数信息**/
	@ApiModelProperty(value = "分数信息StudentScore")
	private ArrayList<StudentScore> studentScore;

	public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
	 
			
	public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
	 
			
	public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
	 
			
	public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
	 
			
	public String getNation() {
        return nation;
    }

    public void setNation(String nation) {
        this.nation = nation;
    }
	 
			
	public String getIdType() {
        return idType;
    }

    public void setIdType(String idType) {
        this.idType = idType;
    }
	 
			
	public String getIdNumber() {
        return idNumber;
    }

    public void setIdNumber(String idNumber) {
        this.idNumber = idNumber;
    }
	 
			
	public Integer getTel() {
        return tel;
    }

    public void setTel(Integer tel) {
        this.tel = tel;
    }
	 
			
	public Date getAdmissionTime() {
        return admissionTime;
    }

    public void setAdmissionTime(Date admissionTime) {
        this.admissionTime = admissionTime;
    }
	 
			
	public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
	 
			
	public String getFaculty() {
        return faculty;
    }

    public void setFaculty(String faculty) {
        this.faculty = faculty;
    }
	 
			
	public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }
	 
			
	public Integer getClassID() {
        return classID;
    }

    public void setClassID(Integer classID) {
        this.classID = classID;
    }
	 
			
	public String getInstructor() {
        return instructor;
    }

    public void setInstructor(String instructor) {
        this.instructor = instructor;
    }
	 
			
	public Character getRegistered() {
        return registered;
    }

    public void setRegistered(Character registered) {
        this.registered = registered;
    }

	public ArrayList<StudentScore> getStudentScore() {
		return studentScore;
	}

	public void setStudentScore(ArrayList<StudentScore> studentScore) {
		this.studentScore = studentScore;
	}

	public StudentInfo() {
        super();
    }
	public StudentInfo(String id, String name, Integer age, Date birthday, String nation, String idType, String idNumber, Integer tel, Date admissionTime, String address, String faculty, String major, Integer classID, String instructor, Character registered) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.birthday = birthday;
		this.nation = nation;
		this.idType = idType;
		this.idNumber = idNumber;
		this.tel = tel;
		this.admissionTime = admissionTime;
		this.address = address;
		this.faculty = faculty;
		this.major = major;
		this.classID = classID;
		this.instructor = instructor;
		this.registered = registered;
	}

	@Override
	public String toString() {
		return "StudentInfo{" +
				"id=" + id +
				", name='" + name + '\'' +
				", age=" + age +
				", birthday=" + birthday +
				", nation='" + nation + '\'' +
				", idType='" + idType + '\'' +
				", idNumber='" + idNumber + '\'' +
				", tel=" + tel +
				", admissionTime=" + admissionTime +
				", address='" + address + '\'' +
				", faculty='" + faculty + '\'' +
				", major='" + major + '\'' +
				", classID=" + classID +
				", instructor='" + instructor + '\'' +
				", registered=" + registered +
				", studentScore=" + studentScore +
				'}';
	}
}

4.CodeToValue

public class CodeToValue extends AbstractBeanField {

    @Override
    protected Object convert(String s) throws CsvDataTypeMismatchException, CsvConstraintViolationException {
        if(s.equals("否")){
            return  '0';
        }
        if(s.equals("是")){
            return  '1';
        }
        return null;
    }
    @Override
    public String convertToWrite(Object value) {
        if(String.valueOf(value).equals("0")){
            return  "否";
        }
        if(String.valueOf(value).equals("1")){
            return  "是";
        }
        return null;
    }
}

三、效果展示

1.download

在这里插入图片描述

2.upload

在这里插入图片描述


总结

回到顶部
官方网站
快速入门
操作excel点这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1446863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

作业2.12

1、选择题 1.1、以下程序的输出结果是____A____。 main() { int k11,k22,k33,x15; if(!k1) x--; else if(k2) if(k3) x4; else x3; printf(“x%d\n”,x); } A x4 B x15 C x14 D x3 1.2、有以下程序&#xff0c;while循环执行____A____次。 int main&#x…

电子邮件、SMTP、POP3 、IMAP协议

目录 1 电子邮件 1.1 电子邮件系统的组成 1.1.1 用户代理 UA (User Agent) 1.1.2 邮件服务器 (Mail Server) 1.1.3 邮件发送和读取协议 1.2 发送和接收电子邮件的重要步骤 1.3 电子邮件的组成 1.4 电子邮件地址的格式 2 简单邮件传送协议 SMTP 2.1 SMTP 通信的三个阶…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

顶级思维方式——认知篇三(心胸与见识)

目录 1、老《三国演义》司马懿 2、司马迁 3、 王立群&#xff1a; 使自己强大起来&#xff0c;这是打破困境的唯一途径 4、鲁迅经典寓言&#xff1a;聪明人、奴才和傻子 5、芒格 6、巴菲特 7、瑞达利欧 8、诸葛亮 1、老《三国演义》司马懿 你等年级轻轻一遇挫折&#x…

蓝桥杯题目解析 --汉诺塔(含C++栈的知识)

该题在蓝桥杯基础数据结构篇&#xff0c;进入后搜索题号1512。 汉诺塔 可以将圆盘临时置于B杆&#xff0c;也可以将A杆移除的圆盘重新移回A杆&#xff0c;但必须遵循上述两条规则。 汉诺塔了解后&#xff0c;题目也了解后&#xff0c;我们先通过试N的个数来找规律&#xff1a;…

Android 10.0 锁屏壁纸 LockscreenWallpaper

前言 一、设置壁纸 通过系统设置进行锁屏壁纸和桌面壁纸的设置。 Setting 部分的代码&#xff1a; packages/apps/WallpaperPicker2/src/com/android/wallpaper/module/DefaultWallpaperPersister.java private int setStreamToWallpaperManagerCompat(InputStream inputStre…

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

【C语言进阶】深度剖析数据在内存中的存储--上

1. C语言中的数据类型的简单介绍 注&#xff1a;C99标准里面&#xff0c;定义了bool类型变量。这时&#xff0c;只要引入头文件stdbool.h &#xff0c;就能在C语言里面正常使用bool类型。 1.1 在C语言中各类型所占内存空间的大小如下 char类型的数据类型大小为1字节即8比特位。…

爬爬爬——今天是浏览器窗口切换和给所选人打钩(自动化)

学习爬虫路还很长&#xff0c;第一阶段花了好多天了&#xff0c;还在底层&#xff0c;虽然不是我专业要学习的语言&#xff0c;和必备的知识&#xff0c;但是我感觉还挺有意思的。加油&#xff0c;这两天把建模和ai也不学了&#xff0c;唉过年了懒了&#xff01; 加油坚持就是…

16 亚稳态原理和解决方案

1. 亚稳态原理 亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。在同步系统中&#xff0c;输入总是与时钟同步&#xff0c;因此寄存器的setup time和hold time是满足的&#xff0c;一般情况下是不会发生亚稳态情况的。在异步信号采集中&#xff0c;由于异步…

MySQL篇----第二十二篇

系列文章目录 文章目录 系列文章目录前言一、什么是表级锁二、什么是页级锁三、什么是行级锁四、什么是悲观锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

2023-12蓝桥杯STEMA 考试 Python 中高级试卷解析

蓝桥杯STEMA 考试 Python 中高级试卷&#xff08;12 月&#xff09; 一、选择题 第一题 以下哪项是取余运算符&#xff1f;&#xff08; C &#xff09; A、* B、// C、% D、 第二题 已知&#xff1a;s "python"&#xff0c;执行 print(s[::2])语句后&…

【Java程序设计】【C00265】基于Springboot的地方废物回收机制管理系统(有论文)

基于Springboot的地方废物回收机制管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的地方废物回收机构管理系统 本系统分为管理员功能模块以及员工功能模块。 管理员功能模块&#xff1a;管理员登录系统后…

使用matplotlib库来绘制柱状图

# coding: utf-8 from matplotlib import pyplot as plt from matplotlib import font_manager# 定义区间和宽度列表 interval [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90] width [5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60] # 定义数量列表 quantity [836, 2737, 3723, …

【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、RasterLite2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、RasterLite2介绍 RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基…

【程序设计竞赛】C++与Java的细节优化

必须强调下&#xff0c;以下的任意一种优化&#xff0c;都应该是在本身采用的算法没有任何问题情况下的“锦上添花”&#xff0c;而不是“雪中送炭”。 如果下面的说法存在误导&#xff0c;请专业大佬评论指正 读写优化 C读写优化——解除流绑定 在ACM里&#xff0c;经常出现…

基于Qt的人脸识别项目(功能:颜值检测,口罩检测,表情检测,性别检测,年龄预测等)

完整代码链接在文章末尾 效果展示 代码讲解(待更新) qt图片文件上传 #include <QtWidgets> #include <QFileDialog>

普通男孩的新年创作纪念日

前言 首先在新春佳节&#xff0c;小编在这里祝各位大佬。萌新友友们新年好&#xff0c;希望每一个烟火般的你在新的一年里 offer 多多&#xff0c;薪资多多 &#xff0c;龙行龘龘 &#x1f409; &#x1f409; &#x1f409; &#x1f409;&#xff0c;前程朤朤 ❤️ ❤️ ❤…

Ps:堆栈模式在摄影后期的应用

Photoshop 的堆栈模式 Stack Mode为摄影师提供了一种强大的后期处理能力&#xff0c;通过堆叠和处理多张照片来实现无法单靠一张照片完成的效果。 正确的前期拍摄策略和后期处理技巧可以显著提高最终图像的质量和视觉冲击力。 ◆ ◆ ◆ 前期拍摄通用注意事项 在前期拍摄时&am…