java导出csv内容乱码

/**
     * CSV文件生成方法
     * @param head表单头
     * @param dataList表单内容
     * @param outPutPath输出路径
     * @param filename表单文件名
     * @return
     */
    public static File createCSVFile(List head, List> 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 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);

Java导出cvs文件的详细代码请查看:点击此处跳转

参考:https://www.cnblogs.com/qq2267711589/p/10822682.html

 

你可能感兴趣的:(web)