Jasper Reports 6.17.0生成的XLSX文件打开报错求助
Jasper Reports生成XLSX文件打开报错的原因及解决办法
生成的.XLSX文件打开时弹出报错提示:我们在'DetailedQuoteReport ISX003178-001.xlsx'中发现部分内容存在问题。是否尝试尽可能恢复内容?若信任此工作簿来源,请点击‘是’。
PDF、Word及.XLS文件均可正常生成并打开,点击“是”后XLSX文件可正常打开。
使用版本:Jasper 6.17.0、Dynamic Jasper 5.3.3、POI 5.2.0、poi-ooxml及ooxml-schemas 1.4
生成Excel的代码如下:
public ByteArrayOutputStream export(JasperPrint jp) { Exporter exporter = new JRXlsxExporter(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // Here we assign the parameters jp and baos to the exporter exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos); if (ReportOutputType.XLS.equals(reportOutputType) || ReportOutputType.XLSX.equals(reportOutputType)) { exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_GRAPHICS, Boolean.FALSE); exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED, Boolean.TRUE); exporter.setParameter(JRXlsExporterParameter.IS_IGNORE_CELL_BORDER, Boolean.TRUE); } try { exporter.exportReport(); } catch (JRException e) { throw new RuntimeException(e); } return baos; }
可能的原因
- POI版本兼容性问题:Jasper 6.17.0默认适配的POI版本与你使用的5.2.0不匹配,生成的XLSX文件存在格式细微错误。
- 导出参数混用问题:对XLSX格式使用了
JRXlsExporterParameter参数,部分参数在XLSX下不兼容,引发格式校验报错。 - 组件版本适配问题:Dynamic Jasper 5.3.3与Jasper 6.17.0的组合存在未适配细节,导致XLSX生成过程中出现异常。
解决办法
1. 对齐POI版本至Jasper官方推荐版本
Jasper Reports 6.17.0官方推荐使用POI 4.1.2版本,替换你的POI依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>
同时移除ooxml-schemas依赖,POI 4.1.2已内置相关schema支持。
2. 区分XLS和XLSX的导出参数
XLSX导出应使用专属的JRXlsxExporterParameter,修改代码参数逻辑:
if (ReportOutputType.XLS.equals(reportOutputType)) { // XLS格式使用JRXlsExporterParameter exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); // 其他XLS专属参数... } else if (ReportOutputType.XLSX.equals(reportOutputType)) { // XLSX格式使用JRXlsxExporterParameter exporter.setParameter(JRXlsxExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); exporter.setParameter(JRXlsxExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); exporter.setParameter(JRXlsxExporterParameter.IS_IGNORE_GRAPHICS, Boolean.FALSE); exporter.setParameter(JRXlsxExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE); exporter.setParameter(JRXlsxExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); exporter.setParameter(JRXlsxExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE); exporter.setParameter(JRXlsxExporterParameter.IS_FONT_SIZE_FIX_ENABLED, Boolean.TRUE); exporter.setParameter(JRXlsxExporterParameter.IS_IGNORE_CELL_BORDER, Boolean.TRUE); }
3. 升级Dynamic Jasper版本
更换为适配Jasper 6.17.0的Dynamic Jasper版本(如6.x系列),确保组件间版本兼容。
4. 排查并禁用冲突参数
尝试逐步移除部分参数(如IS_COLLAPSE_ROW_SPAN、IS_FONT_SIZE_FIX_ENABLED),定位是否由特定参数引发格式错误。
内容的提问来源于stack exchange,提问作者Ruchi
相关产品推荐
相关产品推荐

