alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
31.65k stars 7.46k forks source link

建议增加CSV导出子节流时,对bom头的支持 #3297

Open codesong99 opened 1 year ago

codesong99 commented 1 year ago

使用的版本是3.3.2,虽然3.3.0版本对Issue#3137提出的“导出CSV文件增加bom头”进行了支持,但是直接导出字节流时,仍缺少bom头,建议也对此进行修复。下面是示例代码

    public void csvDownload(HttpServletResponse response) throws IOException {

        OutputStream out = response.getOutputStream();
        // CSV文件增加bom头
        byte[] bom = getBomByte("UTF-8");
        out.write(bom);

        EasyExcel.write(out).excelType(ExcelTypeEnum.CSV)
                .head(headList()).sheet().doWrite(dataList());
        out.close();
    }

    private byte[] getBomByte(String encode) {
        switch (encode) {
            case "UTF-8":
                return new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
            case "UTF-16BE":
                return new byte[] { (byte) 0xFE, (byte) 0xFF };
            case "UTF-16LE":
                return new byte[] { (byte) 0xFF, (byte) 0xFE };
            case "UTF-32BE":
                return new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0xFE, (byte) 0xFF };
            case "UTF-32LE":
                return new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0xFE };
        }
        return null;
    }
ljluestc commented 2 months ago
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class CsvExporter {

    public void csvDownload(HttpServletResponse response, List<List<Object>> dataList, List<List<String>> headList) throws IOException {
        response.setContentType("text/csv");
        response.setCharacterEncoding("UTF-8");

        // 设置文件名,并处理文件名中的特殊字符
        String fileName = "example.csv";
        String encodedFileName = java.net.URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString())
                .replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + encodedFileName);

        // 获取输出流
        OutputStream out = response.getOutputStream();

        // 添加BOM头
        out.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF});

        // 使用EasyExcel导出CSV
        ExcelWriter excelWriter = EasyExcel.write(out).excelType(ExcelTypeEnum.CSV).build();
        WriteSheet writeSheet = EasyExcel.writerSheet(0, "Sheet1").head(headList).build();
        excelWriter.write(dataList, writeSheet);
        excelWriter.finish();
    }
}