java生成csv文件

时间:2025-03-19 07:48:20

应用场景:

用java生成CSV格式文件UTF-8编码,用文本编译器打开是正常显示的,然后用Excel打开是乱码。


问题描述

用java生成的的CSV文件是不带BOM的,windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头。这样用Excel打开CSV文件时就会出现乱码的现象。


CSV文件生成示例

String pdfPath = "D://示例文件.csv" ;
File csvFile = new File(pdfPath);
BufferedWriter csvWtriter = null;
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists()) {
     parent.mkdirs();
}
csvFile.createNewFile();
csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), StandardCharsets.UTF_8), 1024);
String[] title = {"字段1","字段2"};
//使用工具类
writeRow(title,csvWtriter);
csvWtriter.flush();
csvWtriter.close();

CSV文件生成工具类

/**
     * 写一行数据方法
     * @param row
     * @param csvWriter
     * @throws IOException
     */
public static void writeRow(String[] 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();
    }

/**
     * 导出csv格式工具类
     * 创建文件并放置数据  这里放置了表头一行数据
     * @param result 导出数据
     * @param fileName 文件名
     */
    public static void createCsvFile(List result,String fileName,String path){
        try {
            File csvFile = new File(fileName);
            //导入HuTool中CSV工具包的CsvWriter类
            //设置导出字符类型, CHARSET_UTF_8
            CsvWriter writer = cn.hutool.core.text.csv.CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);
            writer.write(result);
            writer.close();
            //保存文件
            FileInputStream fileInputStream=new FileInputStream(csvFile);
            saveFile(fileInputStream,csvFile.getName(),path);
        }
        catch (Exception e){
            System.out.println(e);
        }
    }

/**
     * 文件保存 覆盖保存
     * @param inputStream
     * @param fileName
     */
    public static void saveFile(InputStream inputStream, String fileName, String path) {
        OutputStream os = null;
        try {
            //保存文件路径
            // 1K的数据缓冲 1024000 1M
            byte[] bs = new byte[1024000];
            // 读取到的数据长度
            int len;
            // 输出的文件流保存到本地文件
            File tempFile = new File(path);
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }
            os = new FileOutputStream(tempFile.getPath() + File.separator + fileName);
            // 开始读取
            while ((len = inputStream.read(bs)) != -1) {
                os.write(bs, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 完毕,关闭所有链接
            try {
                os.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

可能产生问题地方:

1、生成的CSV文件用Excel打开会产生中文乱码,需要加载写入第一行数据之前加入这行代码。

csvWtriter.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));

2、生成的CSV文件里面如果某个字段值是纯数字且长度大于11位 在打开的Excel中展示的是科学计数法

在纯数字等有问题的列后面加上制表符"\t"