2

我有一个项目涉及使用 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 报告的应用程序。这可能是由于线程问题吗?

编辑 2:添加了堆栈跟踪的图片 在此处输入图像描述

编辑 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 包编译。

4

1 回答 1

1

问题是自定义运行时映像不包括 jdk.charsets

在使用 jlink 应用程序创建 apache poi 使​​用的运行时时,需要包含 jdk.charsets。

于 2020-03-02T20:29:40.837 回答