一:生成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);
}
以上-----------------
有问题欢迎随时留言谈论,不喜勿喷!
