apache-poi - 由于独立或 xmlns,Apache POI 生成损坏的 excel xlsx 文件?

标签 apache-poi xssf

我有一个网络应用程序(tomcat 8.5.4,java 1.7.0_72),它之前使用 Apache POI 生成有效的 xlsx excel 文件。我正在转换应用程序以使用 maven 管理 jar 依赖项,现在正在生成的文件被 excel 认为已损坏(或无效)。我根本没有更改生成文件的代码,除了一些版本更改和删除一些未使用且不在 Maven 依赖关系树中的 jar(下面列出的已删除 jars)之外,包含的 jars 基本相同。

有谁知道我可以做什么来使 POI 以不同方式生成文件,或者为什么 excel 认为这些更改使其无效?我搜索了很多关于 POI 和损坏的 excel 文件的错误,看起来 POI 中有几个错误,它可能会损坏现有文件或破坏创建大文件,但在这种情况下看起来没有任何应用。我在这里看到了几个看起来很相似但最终没有申请的问题。

差异

当我将之前和之后创建的 xlsx 文件更改为 zip 文件并解压缩它们,然后将目录与 wi​​ndiff 进行比较时,差异是(工作 -> 已损坏)。

[content_types].xml

 <?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> -> <Types>

_rels.rels, _rels\workbook.xml.rels

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> -> <Relationships>

docprops\core.xml

创建时间不同

<?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

xl\styles.xml

numFmtId 低 1

xl\worksheets\sheet1.xml、docprops\app.xml、xl\sharedstrings.xml、xl\workbook.xml

相同

jar

我的公司使用的是本地工件存储库,而不是指向官方 Maven 存储库,因此加载所有依赖项非常有趣。我的假设是这是由我丢失或使用错误的 jar 引起的版本,但我实际上并没有产生任何错误,只是得到了一个错误的文件。

我包括 poi-3.1.11.jar、poi-ooxml-3.11.jar 和 poi-ooxml-schemas-3.11.jar。以前我们在 tomcat/lib 中有 commons-codec 1.9,在 WEB-INF/lib 中有 commons-codec 1.3。在 Maven 下,我包含了 1.9,虽然我也尝试回到 1.3,但文件仍然损坏。

我尝试将所有 poi 版本升级到 3.1.14,但这并没有解决问题。我试着回到之前工作的确切 poi[-ooxml-schemas]-3.11-20141221 jar ,但这并没有解决它。我尝试将 SXSSFWorkbook 切换为普通的 XSSFWorkbook,但这并没有解决问题。

这是我在转换为 maven 时删除的 jar 列表,其中任何一个会对 apache poi 产生任何影响吗?

ecj-4.5.1
el-impl-2.2
itext-2.0.8
jimi-1.0
js
opencsv-1.8
standard (1.1.2)

最佳答案

事实证明,这是由一个 jar (xalan-2.4.1) 引起的,该 jar 作为 fop-0.20.05 的依赖项被引入,在转换为 maven 之前没有被包含。一旦我排除了该依赖性,它就会再次创建有效文件。我应该对 2002 年和 2003 年的所有那些真正的旧 jar 持怀疑态度。

如果以后有人遇到类似的问题但不是由相同的 jar 引起的,这里是我的故障排除方法:

我打开了 POI 记录

-Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
-Dpoi.log.level=1

我发现了一些提示过时的 XML 解析器和无法设置 SAX 安全管理器的错误。一些互联网搜索让我从 fop-0.20.5 中排除了 xercesImpl(我们的应用程序之前没有包含它)。排除它修复了记录器中的错误,但生成的文件仍被 excel 认为已损坏,并且仍然存在相同的差异。

最后我崩溃了,只是做了一个新的简单的 maven java 应用程序,它只是用 POI 创建了一个非常简单的 excel 文件。我最初只使用 poi 和 poi-ooxml 作为依赖项进行了尝试,它生成了一个有效文件。当我从我的完整应用程序中添加所有依赖项时,它生成了一个无效文件。然后我一次删除一个依赖项,直到它起作用。问题依赖项是 fop,我仍然需要它,所以我尝试排除我们的应用程序之前没有包含的每个依赖项,直到文件工作并将 xalan 确定为问题。

关于apache-poi - 由于独立或 xmlns,Apache POI 生成损坏的 excel xlsx 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39301237/

相关文章:

java - 如何使用 Apache Poi 从 excel 读取复数?

java - 如何在每次运行时将从 Excel 文件读取的数据保存到新类中

apache-poi - 如果导出到 Excel 中的行数超过 50 行,下拉验证将不起作用

java - 为什么复制excel内容时只设置最后一个值?

java - 如何使用 Apache POI 中的 XSSF 更改 Excel 中的文本框

java - 无法从 .xlsx 单元格读取 RGB 数据

java - Apache POI - 在Word文件中编辑图表数据时,它返回表单中定义的数据

xml - Apache POI 格式表不显示总行数

java - Java中如何统计excel表的行数和列数

java - 在 Apache POI 中过滤