/**
* CSV文件生成方法
* @param head表單頭
* @param dataList表單內容
* @param outPutPath輸出路徑
* @param filename表單文件名
* @return
*/
public static File createCSVFile(List<Object> head, List<List<Object>> dataList,String outPutPath, String filename) {
File csvFile = null;
BufferedWriter csvWtriter = null;
try {
csvFile = new File(outPutPath + File.separator + filename + ".csv");
File parent = csvFile.getParentFile();
FileOutputStream fos = new FileOutputStream(csvFile);
// 寫入bom頭
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
fos.write(uft8bom);
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
csvFile.createNewFile();
// GB2312使正確讀取分隔符","
csvWtriter = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));
// 寫入文件頭部
writeRow(head, csvWtriter);
// 寫入文件內容
for (List<Object> row : dataList) {
writeRow(row, csvWtriter);
}
csvWtriter.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvWtriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return csvFile;
}
備註:以上是修正後的代碼,正確無誤。
原因是導出的csv文件開頭缺少BOM (BOM就是這3個字節 :"EF BB BF" ,BOM的全稱叫做"Byte Order Mark")字符,導致微軟的記事本Word等打開無法識別部分漢字。win平臺默認的utf8編碼的文本性文件帶有BOM,但是java轉換流寫入的utf8文件不帶BOM,所有Java導出的文件不帶bom會導致部分漢字亂碼。
所以解決辦法:加上bom頭
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
fos.write(uft8bom);
參考:https://www.cnblogs.com/qq2267711589/p/10822682.html