【发布时间】:2019-07-28 20:10:16
【问题描述】:
导出文件 csv、文件 excel 时,日文字符无法正确显示。这是我的代码:
public ResponseEntity<byte[]> searchStudentExportCsv(Page<SearchStudentRes> studentClasses) {
HttpHeaders respHeader = new HttpHeaders();
respHeader.set("Content-disposition", "attachment; filename=students.csv");
StringWriter output = new StringWriter();
String[] csvHeaders = {
InternationalizationMessage.getString("csvfieldname.className"),
InternationalizationMessage.getString("csvfieldname.startDate"),
InternationalizationMessage.getString("csvfieldname.endDate"),
InternationalizationMessage.getString("csvfieldname.startTime"),
InternationalizationMessage.getString("csvfieldname.endTime"),
InternationalizationMessage.getString("csvfieldname.grade"),
InternationalizationMessage.getString("csvfieldname.place"),
InternationalizationMessage.getString("csvfieldname.studentName")
};
try {
CSVPrinter printer = new CSVPrinter(output, CSVFormat.DEFAULT.withHeader(csvHeaders));
studentClasses.forEach(
searchStudentRes -> {
try {
printer.printRecord(
searchStudentRes.getClassName(),
searchStudentRes.getStartDate(),
searchStudentRes.getEndDate(),
searchStudentRes.getStartTime(),
searchStudentRes.getEndTime(),
searchStudentRes.getGrade(),
searchStudentRes.getPlace(),
searchStudentRes.getStudentName()
} catch (IOException e) {
log.error(e.getMessage(), e);
}
});
} catch (IOException e) {
log.error(e.getMessage(), e);
}
return new ResponseEntity(
output.toString().getBytes(Charset.forName("UTF-8")), respHeader, HttpStatus.OK);
}
这是我的控制器
@PostMapping(value = "/exportCsv",produces = "application/octet-stream") 公共响应实体 searchStudentExportCsv(@Valid @RequestBody SearchStudentReq req) { 返回 studentService.searchStudentExportCsv(req); }
请帮帮我,谢谢!
【问题讨论】:
-
检查 csv 文件的编码。它们可以编码为
JIS、SJIS、EUCJP而不是UTF-8。 -
在你的控制器部分遵循代码格式
-
@josephting 错误仅在 Microsoft Office 上,但 Libre Office 不在
-
好像和BOM有关,字节序Mask UTF-8,@JOS