org.apache.commons(commons-csv)下载CSV增加BOM头

网络说明

在这里插入图片描述

代码说明

依赖

<!--https://mvnrepository.com/artifact/org.apache.commons/commons-csv-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.8</version>
        </dependency>

方法

	@GetMapping("/export-csv")
    public void exportCsv(HttpServletResponse response) throws IOException {
        String [] headers = {"数据来源", "基线数据", "数据日期"};
        String fileName = "data-gee-集合.csv"; // CSV 文件名
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("text/csv;charset=UTF-8");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");
        response.setCharacterEncoding("UTF-8");
        OutputStream outputStream = response.getOutputStream();
        outputStream.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF});

        try (CSVPrinter printer = new CSVPrinter(new OutputStreamWriter(outputStream, "UTF-8"), CSVFormat.DEFAULT.withHeader(headers))) {
            printer.printRecord("中文", "data2", LocalDate.now());
            printer.printRecord("中文", "data5", LocalDate.now());
            printer.flush();
        };
    }

解释

这段代码用于在输出CSV文件时,向输出流中写入BOM(Byte Order Mark)头,以解决Excel打开CSV文件乱码的问题。BOM头是一个特殊的字符,它通常用于标识文本文件使用的编码方式。

在使用UTF-8编码保存CSV文件时,如果在文件头部写入BOM头,那么在Excel中打开CSV文件时,Excel会识别文件头中的BOM头信息,自动使用UTF-8的编码方式来解析CSV文件内容。因此,将BOM头写入CSV文件是解决Excel打开CSV乱码问题的常用方法之一。

代码中的new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}就是BOM头的字节表示形式,其中0xEF, 0xBB, 0xBF分别表示BOM头的3个字节,它们对应的16进制表示为0xEFBBBF。

因此,调用outputStream.write()方法向输出流中写入BOM头时,实际就是将BOM头的字节数组写入到输出流中,告诉Excel打开这个CSV文件时使用UTF-8编码方式来读取文件内容,以解决乱码问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P("Struggler") ?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值