springboot读取和写入csv文件数据
前言
csv格式的表格,和xls以及xlsx格式的表格有一些不同,不能够直接用处理xls的方式处理csv;
以下我将介绍如何读取并写入csv数据
准备工作
要处理csv格式的表格数据,我们首先需要引入pom.xml的依赖
<dependency><artifactId>commons-csv</artifactId><groupId>org.apache.commons</groupId><version>1.8</version></dependency><dependency>
读取
前端
一般情况下,我们都是使用前后端交互获取到csv文件,那么前端应该是写一个file类型的input接收文件,为演示方便使用原生的组件
// 上传文件的组件
<input type="file" id="fileInput" name="file">
// 点击上传文件
<button type="button" onclick="uploadFile()">上传</button>
其中js逻辑如下:
// 上传文件方法function uploadFile() {var fileInput = document.getElementById("fileInput");var file = fileInput.files[0];var formData = new FormData();formData.append("file", file);
// 此处调用后端接口上传文件}
ps:需要注意的是,为了正确上传成功文件,我们的请求应该为:multipart/form-data
如果你使用ajax上传,示例如下:
export function uploadFileInterface(obj) { return service.post('/xxx', obj, {headers: { 'Content-Type': 'multipart/form-data' }
})
其中service为我封装的ajax的js
代码如下:
import axios from 'axios'// 创建axios实例
// eslint-disable-next-line no-unused-vars
const service = axios.create({baseURL: '/', // api的base_Urltimeout: 50000 // 请求超时时间
});// 请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config},function (error) {// 对请求错误做些什么return Promise.reject(error)}
)// 响应拦截器
axios.interceptors.response.use(function (config) {// 对响应数据做点什么return config},function (error) {// 对响应错误做点什么return Promise.reject(error)}
)export default service
后端
我的csv文件如下图所示:
读取到的数据为:
后端接收文件的逻辑如下:
@POST@Path("/getFile")public String submitOriginalFile(FormDataMultiPart form) {// 拿取前端标识的文件// 获取文件流InputStream fileIns = form.getField("file").getValueAs(InputStream.class);// 获取文件名,中文不乱码写法String name = new String(form.getField("file").getContentDisposition().getFileName().getBytes("iso-8859-1"), "UTF-8");// 将文件流转byte,可作为其他情况存储起来处理byte[] fileBytes = new InputStreamToByteArray(fileIns);// 将byte数组转csv数据List<CSVRecord> csvData = new FormDataMultiPartJob().byteToCsvFileData(fileBytes);// 遍历每一行的数据for (int i = 0; i < csvData.size(); i++) {System.out.println("每一行数据:" + csvData.get(i));for(int j = 0; j < csvData.get(i).size(); j++) {System.out.println("每一行下每一个单元格数据:" + csvData.get(i).get(j));}}return "读取成功!";}
文件流转byte数组
/*** 文件流转byte*/public byte[] InputStreamToByteArray(InputStream inputStream) {try {BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer;int len;byte[] buf = new byte[2048];while ((len = bufferedInputStream.read(buf)) != -1) {byteArrayOutputStream.write(buf, 0, len);}byteArrayOutputStream.flush();buffer = byteArrayOutputStream.toByteArray();inputStream.close();bufferedInputStream.close();byteArrayOutputStream.close();return buffer;} catch (Exception e) {return null;}}
byte数组转csv数据
/*** byte转csv数据*/public List<CSVRecord> byteToCsvFileData(byte[] bytes) {List<CSVRecord> records = new ArrayList<>();try {// 将 byte 数组转为 InputStreamReader 对象InputStreamReader in = new InputStreamReader(new ByteArrayInputStream(bytes), "UTF-8");// 创建csvParser对象CSVFormat csvFormat = CSVFormat.EXCEL;CSVParser parser = new CSVParser(in, csvFormat);// 读取CSV数据行records = parser.getRecords();parser.close();in.close();} catch (Exception e) {return null;}return records;}
写入
如果需要新建csv文件并往里面写数据,参考如下代码:
try (CSVPrinter printer = new CSVPrinter(new FileWriter("data.csv"), CSVFormat.DEFAULT)) {List<String> header = Arrays.asList("Name", "Age", "Email");printer.printRecord(header);List<List<String>> data = Arrays.asList(Arrays.asList("John", "25", "john@example.com"),Arrays.asList("Alice", "30", "alice@example.com"),Arrays.asList("Bob", "40", "bob@example.com"));for (List<String> rowData : data) {printer.printRecord(rowData);}} catch (IOException e) {e.printStackTrace();}
上面的代码中,我们创建了一个名为 data.csv 的新 CSV 文件,并打开了一个 CSVPrinter 对象。printRecord方法用于打印数据行。
首先,我们打印了一个标题行。标题行包含列的名称。我们将标题行表示为 List 对象 header,并将其传递给 printRecord 方法以打印到文件中
其次,我们打印了一些数据行。数据行包含实际的数据。我们将所有数据行表示为、嵌套的 List 对象 data,并使用 for 循环将每行数据打印到文件中。
需要注意的是,这里使用到了 try-with-resources 语句块来确保 CSVPrinter 能够正确关闭。如果在使用 CSVPrinter 时发生任何异常,它都会在 try-with-resources 语句块结束时被捕获并关闭。
如果你需要使用不同的分隔符或者引号字符来定制 CSV 文件格式,你可以在创建 CSVPrinter 时指定对应的 CSVFormat 对象。例如,如果你要使用制表符作为分隔符,你可以使用以下代码创建 CSVPrinter:
CSVFormat format = CSVFormat.TDF.withHeader("Name", "Age", "Email");
try (CSVPrinter printer = new CSVPrinter(new FileWriter("data.tsv"), format)) {// 逻辑同上
} catch (IOException e) {e.printStackTrace();
}
以上代码会写成一个csv文件保存在你的工程文件里,假如你不想生成文件,而只想拿到byte数组数据做其他操作,参考如下:
try (ByteArrayOutputStream stream = new ByteArrayOutputStream();CSVPrinter printer = new CSVPrinter(new OutputStreamWriter(stream), CSVFormat.DEFAULT)) {List<String> header = Arrays.asList("Name", "Age", "Email");printer.printRecord(header);List<List<String>> data = Arrays.asList(Arrays.asList("John", "25", "john@example.com"),Arrays.asList("Alice", "30", "alice@example.com"),Arrays.asList("Bob", "40", "bob@example.com"));for (List<String> rowData : data) {printer.printRecord(rowData);}// byte数组byte[] bytes = stream.toByteArray();} catch (IOException e) {e.printStackTrace();
}
结语
以上就是如何获取并写入csv文件的过程
相关文章:

springboot读取和写入csv文件数据
前言 csv格式的表格,和xls以及xlsx格式的表格有一些不同,不能够直接用处理xls的方式处理csv; 以下我将介绍如何读取并写入csv数据 准备工作 要处理csv格式的表格数据,我们首先需要引入pom.xml的依赖 <dependency><art…...

【产品经理】工作交接
一、前言 相信大家对这样的场景一定不陌生:有一天去找某个业务的负责人,突然被告知调岗了,或是辞职了,更坏的情况是,甚至完全找不到相关人员了,直接导致工作搁置了。这种情况,你应该多少会感到…...

Springer期刊 latex投稿经验分享
Springer Nature期刊的latex模板下载: Download the journal article template package 以MTAP为例(修改之后对修订稿的投递过程) 第一步:将您的文章提交到适当的期刊轨道或特刊。 如有必要,从下拉菜单中更改您提交的文章类型。 然后点击Proceed 第二步: 与您提交的先前修…...
Python 文件读取的练习
读取文本文件 给定一个名为 ‘example.txt’ 的文本文件,编写一段Python代码,读取文件并打印其内容。 行数统计 给定一个名为 ‘example.txt’ 的文本文件,编写一段Python代码,计算文件中的行数。 单词统计 给定一个名为 ‘exam…...

Redis:主从复制_通过此功能实现对内存上的数据更好的保护
什么是主从复制? 简单的意义上来讲就是一个主人带着几个奴隶,奴隶的全部都是主人给他的,刚开始的时候奴隶是一无所有,是主人将自己的一部分给到奴隶了。因此奴隶翻身了,变得有钱了,也就是有一定价值了&…...

LoRA:大模型的低秩自适应微调模型
对于大型模型来说,重新训练所有模型参数的全微调变得不可行。比如GPT-3 175B,模型包含175B个参数吗,无论是微调训练和模型部署,都是不可能的事。所以Microsoft 提出了低秩自适应(Low-Rank Adaptation, LoRA),它冻结了预…...

拼多多买家如何导出“个人中心”订单信息
经常在拼多多买东西,有时候需要把订单的物流信息导出来,方便记录和统计。现介绍如何使用dumuz工具来实现批量下载拼多多订单。 应用功能描述 模拟人工操作拼多多"个人中心-我的订单”订单网页,批量查询获取拼多多自己买的商品的订单数…...

11.计算机基础-计算机网络面试题—基础知识
本文目录如下: 计算机基础-计算机网络 面试题一、基础知识简述 TCP 和 UDP 的区别?http 与 https的区别?Session 和 Cookie 有什么区别?详细描述一下 HTTP 访问一个网站的过程?https 是如何实现加密的?URL是什么&…...
cs109-energy+哈佛大学能源探索项目 Part-1(项目背景)
1、项目概况 1.1 背景和动机 建筑能源性能的问题现在已经成为建筑业主极为关注的问题,因为这直接转化为成本。根据美国能源部的数据,建筑物消耗了美国全部能源的约40%。一些州和市政府采取了建筑节能目标,以减少城市及区域乃至全球的空气污…...
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用
ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用 1. 摄像头传感器与数据采集(Camera Sensor and Data Acquisition)1.1 数字摄像头传感器基础(Basics of Digital Camera Sensors)1.1.1 传感器类型&am…...
Fixed Function Shader
Properties 属性 Shader语法不区分大小写 基础的数据类型 如何定义一个属性 属性要在"Properties{}"代码块中定义 Properties{_Color("Main Color",Color) (1,1,1,1)_Shininess("Shininess",range(0,8)) 4_MainTex("MainTex",2D…...

HTML- 标签学习之- 列表、表格
无序列表/有序列表: 标签组成( 无序ul 有序 ol ) -> li 父子级标签, ul只能包含li标签, li标签可以包含任意内容。 自定义列表 dl :自定义列表的整体,用于包裹dt/dd 标签dt:自定义列表主题dd:自定义列表的针对主题的…...

Canal搭建 idea设置及采集数据到kafka
Canal GitHub:https://github.com/alibaba/canal#readme 实时采集工具canal:利用mysql主从复制的原理,slave定期读取master的binarylog对binarylog进行解析。 canal工作原理 canal模拟MySQL slave的交互协议,伪装自己为MySQL slav…...

CentOS7搭建伪分布式Hadoop(全过程2023)
##具体操作目录## 1.配置静态ip2.关闭防火墙3.修改主机名为 *master* ,并重启虚拟机vi /etc/hostname 4.修改主机名与ip映射5.设置SSH免密登录6.安装配置java环境----------------------正式Hadoop配置1.移动安装包到合适位置2.解压安装包并重命名3.配置环境变量4.修…...

Linux中文件描述符fd和文件指针filp的理解
简单归纳:fd只是一个整数,在open时产生。起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。 文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件…...
CSS color中常用英文色值
常用颜色英文 red green blue magenta yellow chocolate black aquamarine lime fuchsia brass azure brown bronze deeppink aliceblue gray copper coral feldspar orange orchid pink plum quartz purple aliceblue antiquewith blanchedalmond…...

Springboot idea 中 maven配置问题,找不到依赖:Could not find artifact xxxx
现象:当我们从代码仓拉取新项目时,从该项目的开发同事拿到其maven的settings文件,作为项目的maven配置,为了是能找到工程中所依赖的包,能从远程仓下载下来。 然后本地仓的包,也从同事那边拷贝一份过来&…...

编译原理笔记(一)引论
文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结:这一部分是编译原理的绪论部分内容,对编译程…...

C++ 类和对象下 [补充]
文章目录 友元内部类内部类是外部类的天生友元 匿名对象匿名对象的特性 拷贝对象时的一些编译器优化函数返回值临时空间的存储位置返回值临时空间具有常性 标题相同和不同类型 需要 临时空间 友元 友元函数 重载operator<< 输出自定义类型 比如日期类的这个重载ÿ…...

[CTF/网络安全] 攻防世界 PHP2 解题详析
[CTF/网络安全] 攻防世界 PHP2 解题详析 index.php.phps扩展名姿势 翻译:你能给这个网站进行身份验证吗? index.php index.php是一个常见的文件名,通常用于Web服务器中的网站根目录下。它是默认的主页文件名,在访问一个网站时&am…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...