使用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

回到顶部