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

文章目录

  • 前言
  • 一、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 {@Autowiredprivate 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;}@Overridepublic 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 {@Overrideprotected Object convert(String s) throws CsvDataTypeMismatchException, CsvConstraintViolationException {if(s.equals("否")){return  '0';}if(s.equals("是")){return  '1';}return null;}@Overridepublic 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.mzph.cn/news/682265.shtml

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

相关文章

Linux_进程地址空间

我们用c语言写的程序&#xff0c;经过编译后形成可执行程序存放在硬盘。当运行该程序时&#xff0c;操作系统将该程序加载到内存中&#xff0c;创建进程控制块&#xff0c;变为进程&#xff0c;然后开始执行该程序。大家是否想过&#xff0c;操作系统是如何加载的呢&#xff1b…

25天物理探索旅程 - 第三天:相对论时空观的构建

第三天的课堂&#xff0c;我们将踏上一段穿越时空的奇幻旅程&#xff0c;探索那个由爱因斯坦用天才智慧构建起来的相对论世界。想象一下&#xff0c;你手握一把名为“狭义相对论”的神奇钥匙&#xff0c;准备开启一扇通往全新宇宙观的大门。 首先&#xff0c;我们来聊聊同时性…

【c语言】字符串常见函数 下

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;c语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&a…

幻兽帕鲁Palworld服务器设置参数(汉化)

创建幻兽帕鲁服务器配置参数说明&#xff0c;Palworld服务器配置参数与解释&#xff0c;阿腾云atengyun.com分享&#xff1a; 自建幻兽帕鲁服务器教程&#xff1a; 阿里云教程 https://t.aliyun.com/U/bLynLC腾讯云教程 https://curl.qcloud.com/oRMoSucP 幻兽帕鲁服务器 幻…

如何使用idea连通服务器上的Redis(详细版本)

这里我使用的是阿里云的服务器 打开阿里云的安全组&#xff0c;设置端口为6379 在redis.conf文件中&#xff0c;注释bind 127.0.0.1 将protected-mode设置为no&#xff0c;即关闭保护模式 更改服务器中的防火墙&#xff0c;放行6379端口 # 放行端口 firewall-cmd --zo…

Nacos 的配置管理和配置热更新

一、配置管理的必要性 1. 存在问题 微服务重复配置过多维护成本高&#xff1a;将各个微服务的配置都写到配置管理服务中&#xff0c;单个微服务不去编写配置&#xff0c;而是到配置管理服务中读取配置&#xff0c;实现配置共享&#xff0c;便于修改和维护 业务配置经常变动&a…

【AI视野·今日CV 计算机视觉论文速览 第299期】Mon, 29 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 29 Jan 2024 Totally 55 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Annotated Hands for Generative Models Authors Yue Yang, Atith N Gandhi, Greg TurkGAN 和扩散模型等生成模型已经展示了…

C++:priority_queue模拟实现

C&#xff1a;priority_queue模拟实现 什么是priority_queue模拟实现向上调整算法向下调整算法插入与删除 仿函数 什么是priority_queue priority_queue称为优先级队列。优先级队列是一种特殊的队列&#xff0c;其中每个元素都有一个相关的优先级。元素的优先级决定了它们在队…

Python数学建模之回归分析

1.基本概念及应用场景 回归分析是一种预测性的建模技术&#xff0c;数学建模中常用回归分析技术寻找存在相关关系的变量间的数学表达式&#xff0c;并进行统计推断。例如&#xff0c;司机的鲁莽驾驶与交通事故的数量之间的关系就可以用回归分析研究。回归分析根据变量的…

论文阅读:GamutMLP A Lightweight MLP for Color Loss Recovery

这篇文章是关于色彩恢复的一项工作&#xff0c;发表在 CVPR2023&#xff0c;其中之一的作者是 Michael S. Brown&#xff0c;这个老师是加拿大 York 大学的&#xff0c;也是 ISP 领域的大牛&#xff0c;现在好像也在三星研究院担任兼职&#xff0c;这个老师做了很多这种类似的工…

系统架构25 - 软件架构设计(4)

软件架构复用 软件产品线定义分类原因复用对象及形式基本过程 软件产品线 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕…

九、OpenCV自带colormap

项目功能实现&#xff1a;每隔1500ms轮流自动播放不同风格图像显示&#xff0c;按下Esc键退出 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 colormap.h #pragma once #include<opencv2/opencv.hpp> using namespace cv;class ColorMap { public:vo…

Mybatis开发辅助神器p6spy

Mybatis什么都好&#xff0c;就是不能打印完整的SQL语句&#xff0c;虽然可以根据数据来判断一二&#xff0c;但始终不能直观的看到实际语句。这对我们想用完整语句去数据库里执行&#xff0c;带来了不便。 怎么说呢不管用其他什么方式来实现完整语句&#xff0c;都始终不是Myb…

《Linux 简易速速上手小册》第6章: 磁盘管理与文件系统(2024 最新版)

文章目录 6.1 磁盘分区与格式化6.1.1 重点基础知识6.1.2 重点案例&#xff1a;为新硬盘配置分区和文件系统6.1.3 拓展案例 1&#xff1a;创建交换分区6.1.4 拓展案例 2&#xff1a;使用 LVM 管理分区 6.2 挂载与卸载文件系统6.2.1 重点基础知识6.2.2 重点案例&#xff1a;挂载新…

近十年金融资产收益率

通过掌握大类资产的历年收益率数据&#xff0c;做基于数据的投资&#xff0c;提高胜率和收益率。 下面是同花顺梳理的2014至2023大类金融资产收益率&#xff1a; 基于这个数据&#xff0c;我们再统计两项指标&#xff1a; 1. 每种资产在近十年的投资胜率&#xff08;收益率为…

牛客2024年情人节比赛 娱乐报告

前言 挺欢乐的比赛&#xff0c;有趣 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 第二杯半价 思路: 模拟 分奇偶进行讨论 t int(input())for _ in range(t):n, x list(map(int, input().split()))if n % 2 1:print (n//2 * (x (x 1) // 2) x)else:pr…

RIDERS: Radar-Infrared Depth Estimation for Robust Sensing

RIDERS: 恶劣天气及环境下鲁棒的密集深度估计 论文链接&#xff1a;https://arxiv.org/pdf/2402.02067.pdf 作者单位&#xff1a;浙江大学, 慕尼黑工业大学 代码链接&#xff1a;https://github.com/MMOCKING/RIDERS 1. 摘要&#xff08;Abstract&#xff09; 恶劣的天气条件, …

python 自我检测题--part 1

1. Which way among them is used to create an event loop ? Window.mainloop() 2. Suppose we have a set a {10,9,8,7}, and we execute a.remove(14) what will happen ? Key error is raised. The remove() method removes the specified element from the set. Th…

imazing怎么连接苹果手机

imazing怎么连接苹果手机 要连接苹果手机&#xff0c;您可以选择使用数据线或无线网络&#xff08;Wi-Fi&#xff09;两种方式。以下是具体的步骤&#xff1a; 使用数据线连接&#xff1a; 准备工具&#xff1a;确保您的Mac或Windows电脑已经安装了iMazing软件&#xff0c;并且…

Linux命令行全景指南:从入门到实践,掌握命令行的力量

目录 知识梳理思维导图&#xff1a; linux命令入门 为什么要学Linux命令 什么是终端 什么是命令 关于Linux命令的语法 tab键补全 关于命令提示符 特殊目录 常见重要目录 /opt /home /root /etc /var/log/ man命令 shutdown命令 history命令 which命令 bash…