我可以同时使用 jxls 和 apache poi 吗?

May I use jxls and apache poi together?

我正在制作一个分析一些数据的应用程序,结果必须显示在 excel 文件中。从这个意义上说,我开始使用 Apache POI (3.11)。由于某些报告需要花费大量时间和内存才能重现,我进行了调查并找到了 jxls,经过一些测试后我认为是解决方案。但是现在我发现了一个问题:不能同时使用两个框架。

  1. 我必须将 Apache POI 从 3.11 更新到 3.14,以便使用 jxls-2.3.0
  2. 为了用 jxls 进行测试,我做了一个额外的包,没问题
  3. 我尝试将我的一个 classes 从 Apache POI 迁移到 jxls,但我收到了这个错误:java.lang.IllegalStateException: Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath。这是我的方法的代码:

    private void prepareNewReport(File excelFile) {
        List perforaciones = makePerforacionReport
                                                .makePerforacionData(escenario);
    
    <pre><code>try (InputStream is =  ReportePerforacionTotalDialog.class
                    .getResourceAsStream("PerforacionTotal_template.xls")){
        try (OutputStream os = new FileOutputStream(excelFile)) {
            Context context = new Context();
            context.putVar("perforaciones", perforaciones);
            JxlsHelper.getInstance().processTemplate(is, os, context);
            LOGGER.logger.log(Level.INFO, "Archivo de perfortacion generado con éxito");
        }
    } catch (IOException e) {
        LOGGER.logger.log(Level.SEVERE, "Problemas buscando el archivo", e);
    }
    
    }

这怎么可能?在同一个项目中,我有我的测试 class,只是另一个包,它工作正常。如您所见,它与 jxls 页面中的示例并没有太大区别,而且导入是相同的。

但更糟糕的是,当我尝试清理并构建我的项目时,我遇到了另一个错误:

java.lang.RuntimeException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTArray not found

我查看了为使用 jxls 和 apache poi 而导入的每个库,没错,class 不存在。为了查看这两个框架之间是否存在冲突,我从 class 路径中删除了使用 jxls 所需的所有库。清理并再次构建,没问题,我有 .jar 文件要发送给我的客户,但不完整。

我可以尝试替换所有使用 Apache POI 的 classes,但这意味着很多工作,因为我的项目中使用 POI 多次读取 excel 包含数据的文件并且将另外许多文件写入 excel。我计划使用 jxls 以利用使用模板。

我将不胜感激任何帮助或建议。

对于第一个错误,当 运行 应用程序时,您的类路径中似乎缺少 Apache POI 的 JXLS 转换器。在此处查看 JXLS 入门信息:http://jxls.sourceforge.net/getting_started.html

As it is explained in Transformers section (see Main Concepts)) Jxls core module does not depend on any specific Java-Excel library and works with Excel exclusively through a predefined interface. Currently Jxls supplies two implementations of this interface in separate modules based on the well-known Apache POI and Java Excel API libraries.

如果您使用的是 Maven,请确保在您的 pom.xml 中包含 JXLS 入门页面上列出的 jxls-poi 依赖项:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.9</version>
</dependency>

对于第二个问题,org.openxmlformats.schemas.officeDocument.x2006.docPropsVTypes.CTArray 不在 3.11 (poi-ooxml-schemas-3.11-20141221.jar) 或 3.14 (poi-ooxml-模式-3.14-20160307.jar)。 POI 使用一组精简的 ooxml 模式 类,您需要从 http://central.maven.org/maven2/org/apache/poi/ooxml-schemas/1.3/ or if you're using maven (or another build tool), get the dependency for your build from https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas/1.3

获取 ooxml 模式的完整 jar

例如,对于 maven:

<!-- https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>ooxml-schemas</artifactId>
    <version>1.3</version>
</dependency>

请务必从您的 Maven 中删除 poi-ooxml-schemas 依赖项 pom.xml 以便上面的 ooxml-schemas 优先。