Я использовал эти коды для экспорта отчета в виде файла Excel с помощью JasperReports 4.6:
File reportFile = new File(externalContextAuthenticationConfiguration.getReportTempFolderUrl());
File outputFile = File.createTempFile("reportOutput", ".XLS", reportFile);
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, print);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_FILE, outputFile);
exporterXLS.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
exporterXLS.setParameter(JRXlsExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporterXLS.exportReport();
return outputFile.getAbsolutePath();
Этот код хорошо работает в Windows, но когда проект переходит на OpenSuse Linux, созданный файл Excel похож на эту картинку:
Кто-нибудь знает, в чем проблема?
Наконец, я нашел проблему: проблема не в JasperReport. Он правильно создает отчет в Excel, но когда сервер приложений отправляет его клиенту, проблема возникает
Мы использовали этот код для отправки отчета клиенту:
response.setHeader("Content-Transfer-Encoding", "Cp1256");
response.setContentType("application/vnd.ms-excel-download");
но приложение /vnd.ms-excel-download предназначено только для Windows Excel, и оно уничтожает отчет файла Excel в Linux.
Теперь я использую этот код для его zip, а затем отправляю его клиенту, чтобы он работал как на Windows, так и на Linux-сервере:
File zipFile = new File(fileName.replace("XLS", "ZIP"));
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
addFileToZip("", fileName, zipOutputStream, false);
zipOutputStream.flush();
zipOutputStream.close();