excel 发送以UTF-8编码的CSV文件,并在Java中使用BOM

gfttwv5a  于 2022-12-30  发布在  Java
关注(0)|答案(1)|浏览(195)

我正在编写一个带有一些重音符号的CSV文件,以UTF-8编码。问题是,当我尝试用Excel打开文件时,内容仍然混乱。我必须用Sublime Text打开文件,并将其保存为“UTF-8 with BOM”,以便获得正确的文件(将文件保存为简单的UTF-8不起作用)。我阅读了许多SO问题,并试图应用解决方案,但是它们都不起作用。我不知道这是我写文件时的后端问题,还是我下载文件时的前端问题。

Spring控制器

@Transactional
@RequestMapping(method = RequestMethod.GET, path = "/exportStreets")
public void exportStreets(@RequestParam(value = "city", required = false) Long cityId, HttpServletResponse response) throws IOException {
    // Do some stuff ...

    response.setContentType("text/csv");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-Disposition", "attachment; filename=\"export_streets.csv\"");
    this.exportService.exportStreetsToCsv(toExport, response.getWriter());
}

出口服务

public void exportStreetsToCsv(Set<Street> streets, PrintWriter writer) throws IOException {
    writer.print('\ufeff'); // Write BOM

    CSVFormat csvFormat = CSVFormat.EXCEL.withQuoteMode(QuoteMode.ALL).withDelimiter(';');
    CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat);

    // Print records

    csvPrinter.flush();
    csvPrinter.close();
}

前端

const blobFile = new Blob([response.data], { type: 'text/csv' });
this.FileSaver.saveAs(blobFile, 'test.csv');

我在保存文件前添加BOM,成功地使它工作,但这是一个丑陋的修复,我想避免。另外,由于某种原因,修复了CSV文件的第一行有双引号。以下是修复:

const blobFile = new Blob([new Uint8Array([0xEF, 0xBB, 0xBF]), response.data], { type: 'text/csv;charset=utf-8' });
mrfwxfqh

mrfwxfqh1#

我没有做太多的工作来解决我的问题,我仍然不知道是什么问题,我只需要把PrintWriter改为Writer,并在我的javascript代码中添加字符集。

后端服务

public void exportStreetsToCsv(Set<Street> streets, Writer writer) throws IOException {
    writer.write('\uFEFF'); // Write BOM
    // ...

前端下载

const blobFile = new Blob([response.data], { type: 'text/csv;charset=utf-8' });
this.FileSaver.saveAs(blobFile, 'test.csv');

相关问题