Java使用CSVPrinter框架导出csv文件
1.准备工作准备jar包
官方下载路径:http://commons.apache.org/proper/commons-csv/download_csv.cgi
如果是maven项目,可直接在pom.xml中添加依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.4</version>
</dependency>
2.开发使用流程
2.1先初始化和进行配置相关属性。
可以先看下源码
里面的final属性都是定义导出csv格式。
newFormat(char delimiter):delimiter为csv文件中数据中的界定符号(用于一条数据多个属性的分隔),excel中默认逗号作为每一列的界定符号。
withQuote(Character quote) : quote 为csv文件每个字段通过quote引用,源码中用双引号,不用则添加属性null。
withRecordSeparator():csv文件中数据中的分隔符(用于多条数据的分隔)。
withHeader():表头
DEFAULT默认属性
public static final CSVFormat DEFAULT = new CSVFormat(',', Constants.DOUBLE_QUOTE_CHAR, null, null, null, false, true, "\r\n", null, null, null, false, false, false, false, false);
属性方法可以叠加,即创建一个一个参数的实例,需要什么属性加什么属性举个自己demo的例子。
static String[] reportHeader=new String[]{"Number","name","money","age",
"length"};
CSVFormat csvFormat = CSVFormat.newFormat(',').withQuote(null).withRecordSeparator("\r\n").withIgnoreEmptyLines(true).withHeader(reportHeader);
2.2准备输出流
FileOutputStream fos = new FileOutputStream(path);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
CSV文件是UTF-8格式,Excel是ASCII码格式文件,两者不兼容,需要对UTF-8编码的CSV文件写入一个UTF-8的BOM头,确保其不会乱码。
byte[] uft8bom = { (byte) 0xef, (byte) 0xbb, (byte) 0xbf };
fos.write(uft8bom);
注意这里的是byte[]数组,不需要改为String类型,因为String默认是UTF-16的编码。
2.3准备写入数据
将初始化的csvFormat和输出流写入CSVPrinter对象中,这样准备工作就做好了,接下来的就是写入数据了。
CSVPrinter csvprinter = new CSVPrinter(osw, csvFormat);
写入数据,数据内容只是为了测试,并不要太在意是啥。
for(int i=0;i<10;i++){
csvprinter.printRecord(i,"张三"+i,i+"000.00",i*2,"17"+i);
}
System.out.println("导入成功");
csvprinter.flush();
csvprinter.close();
}catch(Exception e){
e.printStackTrace();
System.out.println("导入失败");
}
数据可能会含有逗号或者双引号这样就会导致错位
处理方法有几种自己摸索的,不一定每个时候都能使用
1.再添加个双引号替换一个双引号,在数据前后添加空格均可。
public String escape(String str) {
String handleStr = str;
if (str != null && !"".equals(str)) {
if(!str.contains(",")&&!str.contains("\"")){
handleStr="\t" +handleStr+"\t";
}
if (str.contains(",")) {
if (str.contains("\"")) {
handleStr = str.replace("\"", "\"\"");
}
handleStr = "\"" + handleStr + "\"";
} else if (str.contains("\"")) {
handleStr = str.replace("\"", "\"\"");
}
if(str.contains("\"")){
handleStr = str.replace("\"", "\"\"");
}
}
return handleStr;
}
这样用excel打开是没什么问题,但是用文本打开就会导致数据不美观,会出现很多个双引号和数据前后存在空格
2.前面初始化使用withQuote(null)在printRecord插入数据对每个数据都加个双引号。
测试结果
这边使用notepad和wps都打开一遍。
都没出现乱码和错位的问题。