在 Linux 上使用 JasperReports 获取损坏的 Excel 文件

Posted

技术标签:

【中文标题】在 Linux 上使用 JasperReports 获取损坏的 Excel 文件【英文标题】:Getting corrupted Excel file with JasperReports on Linux 【发布时间】:2015-01-14 10:44:46 【问题描述】:

我使用此代码通过 JasperReports 4.6 将报告导出为 Excel 文件:

  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 文件如下图所示:

有人知道问题出在哪里吗?

【问题讨论】:

您是否使用 MS Office 检查了结果文件? 是的,当我用 MS Office 打开它时它也损坏了 【参考方案1】:

最后我发现了问题: 问题不在 JasperReport 中。 它在 Excel 扩展中正确创建报告,但是当应用服务器将其发送到客户端时,问题就发生了

我们使用此代码将报告发送给客户:

    response.setHeader("Content-Transfer-Encoding", "Cp1256");
    response.setContentType("application/vnd.ms-excel-download");

但 application/vnd.ms-excel-download 仅适用于 Windows Excel,它会破坏 Linux 中的 Excel 文件报告。

现在,我使用此代码压缩它,然后将其发送到客户端,以便它可以在 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();

【讨论】:

嗨,我不确定这个逻辑。您以 zip 格式下载文件,然后在本地将其(手动)重命名为 xlsx ?我遇到了同样的问题,我注意到,当您将扩展名更改为 zip 时,xlsx 下载的文件无法正常解压缩。 ...

以上是关于在 Linux 上使用 JasperReports 获取损坏的 Excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 JasperReports 与相对路径一起使用

如何修复jasperReports上barcode4j-2.1.jar中的java.lang.NoClassDefFoundError?

JasperReports 怎么与 spring boot集成

如何使用iReport将其替换为另一个报告后,在JasperReports Server中恢复旧版本的报告?

net.sf.jasperreports.engine.JRException如何解决

如何在 JasperReports 中使用条件 TextField?