我有一个项目涉及使用 Apache POIs XSSFWorkbook() 类写入 Excel 电子表格 (.xlsx)。
它在 Java 8 的先前版本的 Apache POI 中运行良好。最近我们将代码库迁移到 OpenJDK 11,并将 Apache POI 的 Maven 版本更新为 4.1.0,如 FAQ Apache POI FAQ中所指定。
在 Eclipse 本身中,它能够按预期在我的桌面上生成 excel 表(在 Win 7 机器上)。但是,在将 maven 打包到 jar 文件中后,jar 版本不起作用。
我是否以某种方式编译了这个错误?下面的片段(不包含所有类,因为还有许多其他类从不同来源读取数据)
private Workbook getWorkbook(String excelFilePath)
throws IOException, EncryptedDocumentException, InvalidFormatException {
Workbook workbook = null;
if (excelFilePath.endsWith("xlsx")) {
workbook = new XSSFWorkbook();
//} else if (excelFilePath.endsWith("xls")) {
//workbook = new HSSFWorkbook();
} else {
throw new IllegalArgumentException("The specified file is not Excel file");
}
return workbook;
}
public void writeReport(String excelFilePath) throws Exception {
workbook = getWorkbook(excelFilePath);
createHelper = workbook.getCreationHelper();
//Summary Sheet
TCOTSummarySheet summarySheet = new TCOTSummarySheet(workbook);
summarySheet.setProject(PROJECT);
summarySheet.setMaps(headerInfo, reportInfo, queryLinks);
summarySheet.createSheet();
//Bug Breakdown Sheet
if (bugBreakdownFlag) {
TCOTBugBreakdownSheet bugBreakdownSheet = new TCOTBugBreakdownSheet(workbook);
bugBreakdownSheet.setSummarySheet(summarySheet);
bugBreakdownSheet.setMaps(headerInfo, reportInfo, queryLinks);
bugBreakdownSheet.createSheet();
}
//Complete Write
try (FileOutputStream outputStream = new FileOutputStream(excelFilePath)) {
workbook.write(outputStream);
}
catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
workbook.close();
}
编辑:
为了给总体项目提供更多背景信息,它是一个用 OpenJDK 11 编写的 JavaFX 项目。
这个特定部分涉及运行从 JavaFX 执行的 Swing 应用程序。这个 Swing 应用程序实际上是使用 Apache POI 生成 Excel 报告的应用程序。这可能是由于线程问题吗?
编辑 3:我尝试将 javax 依赖项添加到我的 pom.xml 中,并尝试将它们添加为引用的外部库,但无济于事。
<!-- JAXB/Javax Dependencies -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
我一直在用 maven 包编译。