Apache POI由于独立或xmlns而生成损坏的excel xlsx文件?

Tim*_*Tim 2 apache-poi xssf

我有一个Web应用程序(tomcat 8.5.4,java 1.7.0_72),它以前使用Apache POI生成有效的xlsx excel文件.我正在努力转换应用程序以使用maven管理jar依赖项,现在生成的文件被excel视为已损坏(或无效).我根本没有更改生成文件的代码,并且包含的​​jar大部分都与一些版本更改相同,并删除了一些未使用但不在maven依赖关系树中的jar(删除了下面列出的jar).

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

差异

当我将之前和之后创建的xlsx文件更改为zip文件并提取它们然后将目录与windiff进行比较时,差异是(工作 - >已损坏).

[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>
Run Code Online (Sandbox Code Playgroud)

_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>
Run Code Online (Sandbox Code Playgroud)

docprops\core.xml

创造的时间不同

<?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)

XL\styles.xml

numFmtId低1

xl\worksheets\sheet1.xml,docprops\app.xml,xl\_ sharedstrings.xml,xl\workbook.xml

相同

罐子

我的公司正在使用本地神器存储库,而不是指向官方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并且文件仍然被破坏.

我尝试升级到3.1.14的所有poi版本,但这并没有解决它.我试着回到之前正在工作但没有解决它的确切的poi [-ooxml-schemas] -3.11-20141221罐子.我尝试将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)
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 6

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

如果有人在将来有类似的问题,但不是由相同的罐子造成这里是我的故障排除方法:

我开启了POI日志记录

-Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
-Dpoi.log.level=1
Run Code Online (Sandbox Code Playgroud)

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

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