首先我们需要对csv文件有基础的认识,csv文件类似excel,可以使用excel打开,但是csv文件的本质是逗号分隔的,对比如下图:
txt中显示:
修改文件后缀为csv后显示如下:
在java中我们一般使用poi操作excel,导入,导出都可以,但是poi很消耗内存,尤其在导出时,这个时候我们其实可以选择导出生成csv文件,因为其跟文本差不多,所以效率很高。
简单写了一个实现类,代码如下:
1 /** 2 * 3 * 导出生成csv格式的文件 4 * @author ccg 5 * @param titles csv格式头文 6 * @param propertys 需要导出的数据实体的属性,注意与title一一对应 7 * @param list 需要导出的对象集合 8 * @return 9 * @throws IOException 10 * Created 2017年1月5日 上午10:51:44 11 * @throws IllegalAccessException 12 * @throws IllegalArgumentException 13 */ 14 public static <T> String exportCsv(String[] titles,String[] propertys,List<T> list) throws IOException, IllegalArgumentException, IllegalAccessException{ 15 File file = new File("d:\test.csv"); 16 //构建输出流,同时指定编码 17 OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(file), "gbk"); 18 19 //csv文件是逗号分隔,除第一个外,每次写入一个单元格数据后需要输入逗号 20 for(String title : titles){ 21 ow.write(title); 22 ow.write(","); 23 } 24 //写完文件头后换行 25 ow.write(" "); 26 //写内容 27 for(Object obj : list){ 28 //利用反射获取所有字段 29 Field[] fields = obj.getClass().getDeclaredFields(); 30 for(String property : propertys){ 31 for(Field field : fields){ 32 //设置字段可见性 33 field.setAccessible(true); 34 if(property.equals(field.getName())){ 35 ow.write(field.get(obj).toString()); 36 ow.write(","); 37 continue; 38 } 39 } 40 } 41 //写完一行换行 42 ow.write(" "); 43 } 44 ow.flush(); 45 ow.close(); 46 return "0"; 47 }
测试类如下:
1 public void test() throws IOException, IllegalArgumentException, IllegalAccessException{ 2 String[] titles = new String[]{"ID","姓名"}; 3 String[] propertys = new String[]{"id","name"}; 4 List<User> list = new ArrayList<User>(); 5 User user; 6 user = new User(); 7 user.setId(1L); 8 user.setName("张三"); 9 list.add(user); 10 user = new User(); 11 user.setId(2L); 12 user.setName("李四"); 13 list.add(user); 14 CsvUtil.getInstance().exportCsv(titles,propertys, list); 15 }
导出后生成的文件跟上图一样,算是一个封装吧,传入表头,以及表头对应实体的属性即可,注意要一一对应。