Java使用CSVPrinter框架导出csv文件

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都打开一遍。
在这里插入图片描述
在这里插入图片描述
都没出现乱码和错位的问题。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值