【问题标题】:May I use jxls and apache poi together?我可以一起使用 jxls 和 apache poi 吗?
【发布时间】:2016-07-07 23:04:24
【问题描述】:

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

  1. 我必须将 Apache POI 从 3.11 更新到 3.14,才能使用 jxls-2.3.0
  2. 为了使用 jxls 进行测试,我制作了一个额外的包,没有问题
  3. 我尝试将我的一个类从 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);
    
    
    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);
    }
    
    }

这怎么可能?在同一个项目中,我有我的测试类,只是另一个包,它工作正常。如您所见,它与 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 而导入的每个库,没错,那个类不存在。为了看看这两个框架之间是否存在冲突,我从类路径中删除了使用 jxls 所需的所有库。再次清理和构建,没有问题,我有我的 .jar 文件要发送给我的客户,但不完整。

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

我会感谢任何帮助或建议。

【问题讨论】:

    标签: apache-poi jxls


    【解决方案1】:

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

    正如 Transformers 部分(参见主要概念)中所解释的那样)Jxls 核心模块不依赖于任何特定的 Java-Excel 库,并且仅通过预定义的接口与 Excel 一起工作。目前,Jxls 在基于著名的 Apache POI 和 Java Excel API 库的不同模块中提供了此接口的两种实现。

    如果您使用的是 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-schemas-3.14-20160307) 的 apache POI ooxml 模式 jar 文件中。罐)。 POI 使用一组精简的 ooxml 模式类,您需要从 http://central.maven.org/maven2/org/apache/poi/ooxml-schemas/1.3/ 获取 ooxml 模式完整 jar,或者如果您使用 maven(或其他构建工具),请从 https://mvnrepository.com/artifact/org.apache.poi/ooxml-schemas/1.3

    例如对于 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 pom.xml 中删除 poi-ooxml-schemas 依赖项,以便上面的 ooxml-schemas 优先。

    【讨论】:

    • 我知道是 Finbarr O'B 告诉我的。我通过他的推荐解决了第二个问题,但我最终所做的导入是 ooxml.schemas-1.1.jar, 1.3,因为他推荐不包含 CTArray 类。但重要的是第一个错误,真正的问题是 getResourcesAsStream() 方法没有找到文件,但报告的错误是错误的,在我修复文件所在的路径后问题消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多