Ожидаемый текст: Riskli vergi ödəyicilərinin axtarışı
Что отображается в Excel: Riskli vergi ödÉ™yicilÉ™rinin axtarışı
Мой код:
public void writeCsvForInformationalServiceDetailed(
List items,
LocalDateTime periodStart,
LocalDateTime periodEnd,
HttpServletResponse response) {
response.setContentType("text/csv; charset=UTF-8");
response.setHeader(
"Content-Disposition",
"attachment; filename=informational_service_detailed.csv"
);
try (ServletOutputStream out = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(writer)) {
bw.write('\ufeff');
bw.write("Hesabatın əhatə etdiyi tarix aralığı,");
bw.write(periodStart.format(DATE_TIME_FORMATTER)
+ " - "
+ periodEnd.format(DATE_TIME_FORMATTER));
bw.newLine();
bw.write("Cəmi,");
bw.write(String.valueOf(items.size()));
bw.newLine();
bw.newLine();
bw.write(String.join(",",
"Əməliyyat İD",
"E-xidmətin adı",
"IP",
"Start Date",
"Start Time",
"End Date",
"End Time",
"Status",
"Error Created At",
"Error Message",
"Level",
"Comment"
));
bw.newLine();
for (InformationalServiceDetailedExcelItem item : items) {
bw.write(String.join(",",
csv(item.getServiceUsageId()),
csv(getSafeValue(item.getService().getName(), Language::getAz)),
csv(item.getIp()),
csv(formatDate(item.getServiceStartedAt(), DATE_FORMATTER)),
csv(formatDate(item.getServiceStartedAt(), TIME_FORMATTER)),
csv(formatDate(item.getServiceEndedAt(), DATE_FORMATTER)),
csv(formatDate(item.getServiceEndedAt(), TIME_FORMATTER)),
csv(item.getStatus() != null ? item.getStatus().getValueAz() : ""),
csv(formatDate(item.getErrorCreatedAt(), DATE_TIME_FORMATTER)),
csv(getSafeValue(item.getError(), e -> e.getMessage().getAz())),
csv(getSafeValue(item.getLevel(), LevelType::getDescriptionByValue)),
csv(item.getComment())
));
bw.newLine();
}
bw.flush();
} catch (Exception e) {
log.error("ActionLog.writeCsvForInformationalServiceDetailed.failed: RID={}",
new HttpUtil().getCurrentRequestId(), e);
throw new FileGenerateException();
}
}
private String csv(Object value) {
if (value == null) return "";
String s = value.toString().replace("\"", "\"\"");
if (s.contains(",") || s.contains("\"") || s.contains("\n") || s.contains("\r")) {
return "\"" + s + "\"";
}
return s;
}
Что я пробовал:
-
UTF-8 с спецификацией (\ufeff)
-
Добавлена строка sep=,
-
Пробовала кодировку Windows-1254
-
Правильное экранирование CSV
- Java 1
- Spring Boot
- MS Excel 2016/2019 (отображает искаженный текст)
- WPS Office (работает правильно)
Подробнее здесь: https://stackoverflow.com/questions/798 ... exported-w
Мобильная версия