首先我們需要對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("\r\n");
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("\r\n");
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 }
導出後生成的文件跟上圖一樣,算是一個封裝吧,傳入表頭,以及表頭對應實體的屬性即可,注意要一一對應。