使用 jxls-poi-1.0.12 的 jxls 2.5 兼容性

jxls 2.5 compacibility for using jxls-poi-1.0.12

我正在使用 jxls-poi-1.0.12。 在 jxls 2.5 发布后,gradle 自动将 jxls 更新为 2.5。结果我在 运行ning JxlsHelper.getInstance().processTemplate(context, transformer)

时得到了一个异常
java.lang.AbstractMethodError: org.jxls.transform.poi.PoiTransformer.adjustTableSize(Lorg/jxls/common/CellRef;Lorg/jxls/common/Size;)V
at org.jxls.command.EachCommand.applyAt(EachCommand.java:262)
at org.jxls.area.XlsArea.applyAt(XlsArea.java:172)
at org.jxls.command.EachCommand.processCollection(EachCommand.java:296)
at org.jxls.command.EachCommand.applyAt(EachCommand.java:255)
at org.jxls.area.XlsArea.applyAt(XlsArea.java:172)

我检查了 jxls 2.5 更新。我发现当 EachCommand 运行ning 时,jxls 2.5 向转换器接口添加了 adjustTableSize() 方法。但是,PoiTransformer 没有实现这个方法,所以我得到了这个错误。这意味着 jxls 2.5 不兼容 jxls-poi-1.0.12.

当然,我可以升级我的 poi,但需要很多时间。是否可以降级我的 jxls 或禁用 [​​=24=] Transformer.adjustTableSize()?

这是我的build.gradle

compile group: 'org.jxls', name: 'jxls-jexcel', version: '1.0.6'
compile group: 'org.jxls', name: 'jxls-poi', version: '1.0.12'
compile group: 'org.jxls', name:'jxls', version :'2.4.0'

为了能够将 Jxls 2.5.0 与 Apache POI 一起使用,您必须切换到 jxls-poi 1.1.0,其中已实现 Transformer.adjustTableSize()。

如果您不想使用最新的 POI 版本,您可以尝试将其从 jxls-poi 依赖项中排除并使用旧的 POI 版本,但是如果POI发布。

2019 年 2 月 16 日更新: Jxls 2.5.1 版本现已发布。 此版本应向后兼容 jxls-poi 1.0.x 版本,因此当该版本在 Maven Central 中可用时问题应该消失。

我们今天遇到了同样的问题。 经过排查,我们找到了解决的方法。所以请让我分享。

请尝试如下更改 gradle.build。

compile ("org.jxls:jxls-poi:1.0.12"){
    transitive = false
  }

一旦更改,gradle 将忽略 jxls-poi 指定的依赖项。

详细请看文档。 (本文档适用于 gradle 4.10,但我们测试了 gradle 3.x) https://docs.gradle.org/4.10/userguide/managing_transitive_dependencies.html#sub:disabling_resolution_transitive_dependencies


这是因为jxls-poi的版本设置。这里是POI的Dependency Version Requirement Specification的规范。

  • 1.0:"Soft" 1.0 的要求(只是一个建议,如果它匹配所有其他 - - - 依赖范围)
  • [1.0]:"Hard" 1.0
  • 的要求
  • (,1.0]: x <= 1.0
  • [1.2,1.3]: 1.2 <= x <= 1.3
  • [1.0,2.0]: 1.0 <= x < 2.0
  • [1.5,]: x >= 1.5
  • (,1.0],[1.2,): x <= 1.0 或 x >= 1.2;多个集合以逗号分隔
  • (,1.1),(1.1,):这不包括 1.1(例如,如果已知它不能与该库结合使用)

https://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification

所以,org.jxls:jxls:[2.4.0,)表示使用2.4.0或更高版本。

# this is the part of result of gradle dependencies command.
...
+--- org.jxls:jxls-poi:1.0.12
|    |    +--- org.jxls:jxls:[2.4.0,) -> 2.5.0 (*)
...

一旦排除了jxls-poi的设置,jxls的版本就会更改为指定的版本。

之前

|    +--- org.jxls:jxls:2.4.0 -> 2.5.0 (*)

之后(解决)

|    +--- org.jxls:jxls:2.4.0 (*)

上面说的有道理,但不太对

compile("org.jxls:jxls-poi:1.0.15"){
        transitive = false
    }
compile("org.jxls:jxls:2.4.0")