CSV简介
CSV全称是:Comma Separated Values (逗号分隔值)或者 Character Separated Values(字符分隔值)。其文件以纯文本形式存储表格数据(数字和文本)。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。每一行记录位于一个单独的行上,用回车换行符CRLF(也就是\r\n)分割。
对于excel来说默认使用 ,进行分割数据。
每一行记录最后一个字段后不能跟逗号
每一行一条记录
列为空需要指定 ""
用回车换行符CRLF(\r\n)分割每条记录
纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
上面的内容从百科上总结(抄袭)的。
我的踩坑经历
之前做了一个CSV导出的小功能,然后踩了很多坑。最后蓦然回首,发现真的好简单,自己给自己挖了很多坑,简单的功能被自己弄的异常复杂。
作为一个聪明的程序员,我肯定不会重复造轮子,就在网上随便找了一份代码。然后噩梦从此开始。
我比较懒,所以使用反射来减轻我的工作量
我的最初版本
public class ExportCSVUtil{
private Class cls;//数据类型
private List list; //存放需要填充的数据
private List methods;//存储get方法
/**
*
* @param list 填充数据
* @param cls 数据类型
* @throws Exception
*/
public ExportCSVUtil(List list,Class cls) throws Exception{
this(list,cls,true);
}
public void doExport(OutputStream out) throws IOException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
OutputStreamWriter outputStreamWriter =new OutputStreamWriter(out,"utf8");
BufferedWriter writer = new BufferedWriter(outputStreamWriter);//使用缓冲流,比较适合写文本操作,效率可能也会高些
writeBody(writer,list);
outputStreamWriter.flush();
outputStreamWriter.close();
}
/**
*向输出流中写数据
* @param list 填充数据
* @param writer 缓冲流
*/
public void writeBody(BufferedWriter writer,List list){
int i=0;
int length = methods.length;
for(T obj: list){
for(Method method: methods){
Object result= method.invoke(obj,new Object[]);反射获取get方法的值
String str=null;
if(result==null) //处理空值
str=" ";
else
str=result.toString();
if(i++ <=length-1)
writer.write(