一:生成csv
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.google.gson.Gson; public class CsvTest2 { public static void main(String[] args) { List<Object> list = new ArrayList<Object>(); HashMap<Object, Object> map = new LinkedHashMap<Object,Object>();//按照key的添加順序生成列 map.put("guid", 1); map.put("name", "xiaoming"); map.put("num", "\t"+"2018000367807013");//\t防止第16位數字置為0 map.put("createtime", new Date()); list.add(map); OutSqlCsv(list,"e:\\test.csv"); } /** * * @param list 數據集合 * @param outPutPath 生成文件路徑 */ public static void OutSqlCsv(List<Object> list,String outPutPath) { Gson gson = new Gson(); //給csv文件添加標題 List<Object> exportData = new ArrayList<Object>(); //數據主體 List<List<Object>> datalist = new ArrayList<List<Object>>(); for(int i=0;i<list.size();i++) { //數據主體 List<Object> data = new ArrayList<Object>(); Object list_obj = list.get(i); Map<Object,Object> map_list_obj = gson.fromJson(gson.toJson(list_obj), Map.class); for(Object key2:map_list_obj.keySet()) { if(i==0) { exportData.add(key2); } data.add(map_list_obj.get(key2)); } datalist.add(data); } createCSVFile(exportData, datalist, outPutPath); } /** * 生成CSV文件的主體方法 * @param head * @param dataList * @param outPutPath * @param filename * @return */ public static File createCSVFile(List<Object> head, List<List<Object>> dataList, String outPutPath) { File csvFile = null; BufferedWriter csvWtriter = null; try { csvFile = new File(outPutPath); File parent = csvFile.getParentFile(); if (parent != null && !parent.exists()) { parent.mkdirs(); } csvFile.createNewFile(); // GB2312使正確讀取分隔符"," csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024); // 寫入文件頭部 writeRow(head, csvWtriter); // 寫入文件內容 for (List<Object> row : dataList) { writeRow(row, csvWtriter); } csvWtriter.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(csvWtriter!=null) { csvWtriter.close(); } } catch (IOException e) { e.printStackTrace(); } } return csvFile; } private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException { // 寫入文件頭部 for (Object data : row) { StringBuffer sb = new StringBuffer(); String rowStr = sb.append("\"").append(data).append("\",").toString(); csvWriter.write(rowStr); } csvWriter.newLine(); } }
二:注意windows路徑\\ linux路徑/ 或用 File.separator 進行適配
三:處理字段為string的數值長度大於15的字符
if(rDataVal instanceof String && ((String) rDataVal).length()>15) {
//保存Excel時防止第16位數字 被置0
rDataVal = "\t"+rDataVal+"\t";
}else if(rDataVal instanceof Date) {//轉化日期類型
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
rDataVal = dateFormat.format(rDataVal);
}
以上-----------------
有問題歡迎隨時留言談論,不喜勿噴!