Ошибка японского символа при экспорте файла csv java spring

При экспорте файла 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 (значение = "/exportCsv", производит = "приложение/октет-поток") public ResponseEntity searchStudentExportCsv(@Valid @RequestBody SearchStudentReq req) { вернуть studentService.searchStudentExportCsv (требуется); }

Пожалуйста, помогите мне, Спасибо Вам!

Проверьте кодировку файлов csv. Они могут быть закодированы в JIS, SJIS, EUCJP вместо UTF-8.

josephting 07.03.2019 03:59

Следуйте форматированию кода в части вашего контроллера

Mark Melgo 07.03.2019 04:01

@josephting Ошибка только в Microsoft Office, но не в Libre Office

Hiệp Bùi Văn 07.03.2019 04:14

Кажется, это связано со спецификацией, порядком байтов, маской UTF-8, @JOS

Hiệp Bùi Văn 07.03.2019 04:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 414
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
public void exportCsv2(HttpServletResponse response) throws IOException {
    List<Person> list = new ArrayList<>();
    Person person1 = new Person(1, "チャウ クエ ギー", 23);
    Person person2 = new Person(2, "グエン イエン タイン", 24);
    Person person3 = new Person(3, "ファン ティ タイン トウイ", 25);
    Person person4 = new Person(4, "ホアン ガー れ テイ トゥ ウエン", 26);

    list.add(person1);
    list.add(person2);
    list.add(person3);
    list.add(person4);

    String[] headers = {"ID", "Name", "Age"};
    response.setContentType("application/vnd.ms-excel:UTF-8"); // or you can use text/csv
    response.setHeader("Content-Disposition", "attachment; filename=listPerson.csv");
    OutputStream outputStream= response.getOutputStream();
    outputStream.write(0xEF);
    outputStream.write(0xBB);
    outputStream.write(0xBF);

    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
    CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT.withHeader(headers));
    list.forEach(person -> {
        try {
            csvPrinter.printRecord(person.getId(),person.getName(),person.getAge());
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
    });
    csvPrinter.close();
}

с javascript вам нужно добавить "\ uFEFF"

Hiệp Bùi Văn 13.03.2019 10:35

Другие вопросы по теме