使用Apache 的 commons-csv 实现 CSV 文件导出
1. CSV 简介
CSV全称是:Comma Separated Values (逗号分隔值)或者 Character Separated Values(字符分隔值)。其文件以纯文本形式存储表格数据(数字和文本)。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。每一行记录位于一个单独的行上,用回车换行符CRLF(也就是\r\n)分割。
-
对于excel来说默认使用 ,进行分割数据。
-
每一行记录最后一个字段后不能跟逗号
-
每一行一条记录
-
列为空需要指定 ""
-
用回车换行符CRLF(\r\n)分割每条记录
-
纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312
2. 实现 CSV 文件导出
采用 Apache 开源的 commons-csv 包,详细内容参考 官网
2.1 使用
2.1.1 引入依赖
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.7</version> </dependency>
2.1.2 API
- print(Object value); // 写入一个单元格数据
- printRecord(Iterable<?> values); // 写入一行数据
- printRecords(Iterable<?> values);// 写入多行数据
其他重载方法⬇️
2.2 封装一个导出方法
/** * 导出 csv 文件 * [@param](https://my.oschina.net/u/2303379) out 输出流 * [@param](https://my.oschina.net/u/2303379) iter 数据 我这里传 List<List<Object>> 类型 * [@param](https://my.oschina.net/u/2303379) charset 字符集编码 * [@param](https://my.oschina.net/u/2303379) header 表头 */ public void exportCSVFile(OutputStream out, Iterable<?> iter, String charset, String... header) { try { // 写入bom, 防止中文乱码 byte[] bytes = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}; out.write(bytes); OutputStreamWriter osw = new OutputStreamWriter(out, charset); CSVFormat csvFormat = CSVFormat.EXCEL.withHeader(header); CSVPrinter csvPrinter = new CSVPrinter(osw, csvFormat); csvPrinter.printRecords(iter); csvPrinter.flush(); csvPrinter.close(); } catch (IOException e) { e.printStackTrace(); } }
2.3 使用示例
List<List<Object>> lists = new ArrayList<>(); List<Object> list1 = new ArrayList<>(); list1.add("张三"); list1.add(18); list1.add("男"); lists.add(list1); List<Object> list2 = new ArrayList<>(); list2.add("李四"); list2.add(20); list2.add("女"); lists.add(list2); String[] header = {"姓名", "年龄", "性别"}; // 省略 out exportCSVFile(out, lists, "UTF-8", header);
- Excel 打开
-
文本编辑器打开
张三,18,男
李四,20,女
2.4 可能遇到的问题
-
使用 Excel 打开出现中文乱码
上面的示例代码采用的是写入 bom ,编码为 UTF-8 的方式解决的,也有其他方案是使用编码为 GBK。
-
用 Excel 打开后,日期格式会变成 ### 或者 2019/01/01 以及较大数字会变成科学技术法
写数据时加上制表符,一个制表符不够,就 2 个
不要调用 printRecords(); 方法,而是通过遍历数据调用 csvPrinter.print("\t"+ 数据 +"\t");public void exportCSVFile(OutputStream out, Iterable<?> iter, String charset,String... header) { try { // 写入bom, 防止中文乱码 byte[] bytes = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}; out.write(bytes); OutputStreamWriter osw = new OutputStreamWriter(out, charset); CSVFormat csvFormat = CSVFormat.EXCEL.withHeader(header); CSVPrinter csvPrinter = new CSVPrinter(osw, csvFormat); Iterator<?> iterator = iter.iterator(); while (iterator.hasNext()) { Collection list = (Collection)iterator.next(); // 开始写一行数据 list.forEach(c->{ try { csvPrinter.print("\t" +c.toString() +"\t" ); } catch (IOException e) { e.printStackTrace(); } }); // 写完一行,需要换行 csvPrinter.println(); } csvPrinter.flush(); csvPrinter.close(); } catch (IOException e) { e.printStackTrace(); } }
注意: 添加了制表符之后,用文本编辑器打开后,格式就会变得很难看, 如下图所示:
-
写入的数据包含逗号,双引号等特殊字符时,导出的 csv 文件用文本编辑器打开,数据会用双引号包裹起来, 如下所示:
-
通过 Excel 修改 CSV 文件会出现兼容性问题
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mozilla 将 Thunderbird 项目转移到新的子公司
Mozilla 基金会宣布,它正在将 Thunderbird 电子邮件客户端移至名为MZLA Technologies Corporation 的新子公司。 Mozilla 表示,Thunderbird 将继续保持免费和开源,但是通过将该项目从其基础转移到公司实体,他们将能够从该产品中获利,并比以前更容易为其开发付费。 目前,Thunderbird 主要是通过产品用户群的慈善捐款来维持生命的。 Mozilla 产品经理 Philipp Kewisch表示:“迁移到 MZLA Technologies Corporation ,不仅将使得 Thunderbird 项目具有更大的灵活性和敏捷性,还将使我们能够探索向用户提供 Mozilla 基金会无法提供的产品和服务”。并称,“此举将使该项目通过合作伙伴关系和非慈善捐款来收取收入,这些捐款又可以用来支付新产品和服务的成本。” 此外,Firefox 浏览器(Mozilla 的主要产品)也通过名为 Mozilla Corporation(Mozilla Foundation 的子公司)的公司实体以类似的方式进行管理。 回顾Thunderbird...
- 下一篇
使用BeetleX.NetBenchmark压测TCP,HTTP和Websocket服务
NetBenchmark是针对网络服务压测订制的开源组件,组件提供TCP,HTTP和Websocket的压力测试基础功能;为了更好的符合业务需求组件不提供UI配置信息源的方式(毕竟这种方式只能作有限制测试),而是由使用者来自己制定相应的逻辑代码来进行具体的业务测试。组件基于netstandard2.0,除了可以在.NET CORE上运行外还可以在.NET FX接下来介绍一下组的使用。 引用组件 https://www.nuget.org/packages/BeetleX.NetBenchmark/ Github: https://github.com/IKende/NetBenchmark TCP测试 组件通过Benchmark.Tcp方法来构建一个TCP测压实例,方法如下: public static Runner Tcp<Packet, Token>(string host, int port, int connections, Func<BeetleX.Clients.AwaiterClient, Token, Task> handler) where...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Red5直播服务器,属于Java语言的直播服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库