我有一个Web应用程序(tomcat 8.5.4,java 1.7.0_72),它以前使用Apache POI生成有效的xlsx excel文件。我正致力于将应用程序转换为使用maven管理jar依赖项,现在生成的文件被excel视为已损坏(或无效)。我根本没有改变生成文件的代码,并且包含的jar大多数都是相同的,除了一些版本更改和删除一些未使用的jar而不是maven依赖树(删除下面列出的jar)。 / p>
有谁知道我可以做些什么来导致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>
_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
同
我的公司正在使用本地神器存储库,而不是指向官方maven存储库,所以加载所有依赖项很有趣。我的假设是这是由一个罐子引起的。我丢失或使用了错误的版本,但我实际上并没有产生任何错误,只是收到了错误的文件。
我包括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)
答案 0 :(得分:6)
事实证明这是由一个罐子(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
我发现一些错误抱怨过时的XML解析器并且无法设置SAX安全管理器。一些互联网搜索让我从fop-0.20.5中排除xercesImpl(我们的应用程序以前没有包含)。排除它修复了记录器中的错误,但正在生成的文件仍然被excel视为损坏,并且仍然具有相同的差异。
最后我崩溃了,刚刚制作了一个新的简单的maven java应用程序,它只是用POI创建了一个非常简单的excel文件。我最初尝试使用poi和poi-ooxml作为依赖项,它生成了一个有效的文件。当我从我的完整应用程序添加所有依赖项时,它生成了一个无效文件。然后我一次删除一个依赖项,直到它工作。问题依赖是我仍然需要的fop,然后我尝试排除我们的应用程序之前没有包含的每个依赖项,直到文件工作并将xalan识别为问题。
答案 1 :(得分:0)
我有完全相同的问题经过相同的步骤。对于我来说,删除被另一个依赖项继承的xalan
依赖项(通过排除它)无济于事。我添加了最新版本的xalan(xalan 2.7.1
),它挽救了我的一天。