Apache poi Apache POI生成损坏的excel xlsx文件是因为单机版还是xmlns?

Apache poi Apache POI生成损坏的excel xlsx文件是因为单机版还是xmlns?,apache-poi,xssf,Apache Poi,Xssf,我有一个web应用程序(Tomcat8.5.4,Java1.7.072),它以前使用ApachePOI生成有效的XLSxExcel文件。我正在使用maven转换应用程序以管理jar依赖关系,现在excel认为生成的文件已损坏(或无效)。我根本没有更改生成文件的代码,所包含的jar基本上是相同的,除了一些版本更改和删除一些未使用且不在maven依赖关系树中的jar(下面列出的已删除jar) 是否有人知道我可能会做些什么导致POI以不同的方式生成文件,或者为什么excel认为这些更改使其无效?我已经

我有一个web应用程序(Tomcat8.5.4,Java1.7.072),它以前使用ApachePOI生成有效的XLSxExcel文件。我正在使用maven转换应用程序以管理jar依赖关系,现在excel认为生成的文件已损坏(或无效)。我根本没有更改生成文件的代码,所包含的jar基本上是相同的,除了一些版本更改和删除一些未使用且不在maven依赖关系树中的jar(下面列出的已删除jar)

是否有人知道我可能会做些什么导致POI以不同的方式生成文件,或者为什么excel认为这些更改使其无效?我已经搜索了很多POI错误和损坏的excel文件,看起来POI中有几个bug,可能会损坏现有文件或破坏创建大文件的功能,但在本例中没有应用任何类似的功能。我在这里看到了几个问题,看起来它们可能相似,但最终没有应用

分歧 当我将之前和之后创建的xlsx文件更改为zip文件并将其解压缩,然后将目录与windiff进行比较时,差异是(工作->损坏)

[内容类型].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>

它原来是由一个jar(xalan-2.4.1)引起的,该jar是作为fop-0.20.05的依赖项拉入的,在转换为maven之前没有包含它。一旦我排除了依赖项,它就会再次创建有效文件。我应该对2002年和2003年的那些真正的旧罐子产生怀疑

如果将来有人遇到类似问题,但不是由相同的罐子引起的,我的故障排除方法如下:

我打开了POI日志记录

-Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
-Dpoi.log.level=1
我发现一些错误,抱怨XML解析器过时,无法设置SAX安全管理器。一些互联网搜索导致我将xercesImpl(我们的应用程序以前没有包括)从fop-0.20.5中排除。排除它修复了记录器中的错误,但excel仍认为生成的文件已损坏,并且仍然存在相同的差异


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

我遇到了完全相同的问题,并经历了相同的步骤。对于我来说,删除另一个依赖项通过排除它而继承到我的项目中的
xalan
依赖项没有帮助。我添加了最新版本的xalan(
xalan 2.7.1
),这节省了我的时间。

使用了什么版本的Apache XMLBeans?请参阅:“如果可能,我们建议您将XMLBeans 2.6.0与Apache POI一起使用,这是二进制发行包中现在提供的版本。”@AxelRichter我们包括XMLBeans 2.6.0
<?xml version="1.0" encoding="UTF-8" standalone="no"?> -> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
ecj-4.5.1
el-impl-2.2
itext-2.0.8
jimi-1.0
js
opencsv-1.8
standard (1.1.2)
-Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger
-Dpoi.log.level=1