使用Apache的commonscsv实现CSV文件导出
对于excel来说默认使用 ,进行分割数据。
每一行记录最后一个字段后不能跟逗号
每一行一条记录
列为空需要指定 ""
用回车换行符CRLF(
)分割每条记录
纯文本,使用某个字符集,比如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
/** * 导出 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.2 示例
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.3 问题
使用 Excel 打开出现中文乱码
上面的示例代码采用的是写入 bom ,编码为 UTF-8 的方式解决的,也有其他方案是使用编码为 GBK。
用 Excel 打开后,日期格式会变成 ### 或者 2019/01/01 以及较大数字会变成科学技术法
写数据时加上制表符,一个制表符不够,就 2 个
不要调用 printRecords(); 方法,而是调用 csvPrinter.print(" "+ 数据 +" ");
注意: 添加了制表符之后,用文本编辑器打开后,格式就会变得很难看
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(" " +c.toString() +" " );
} catch (IOException e) {
e.printStackTrace();
}
});
// 写完一行,需要换行
csvPrinter.println();
}
csvPrinter.flush();
csvPrinter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
写入的数据包含逗号,双引号等特殊字符时,导出的 csv 文件用文本编辑器打开,数据会用双引号包裹起来
通过 Excel 修改 CSV 文件会出现兼容性问题
以上是 使用Apache的commonscsv实现CSV文件导出 的全部内容, 来源链接: utcz.com/z/512913.html