org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException 正在读取 .xlsm 文件
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException while reading .xlsm file
我正在尝试使用 apache poi 读取 .xlsm 文件,该文件在 spring 引导应用程序 (JDK 1.8)
中运行
以下是我在 build.gradle 文件
中的条目
compile "org.apache.poi:poi:3.17"
compile "org.apache.poi:poi-ooxml:3.17"
这是尝试读取 WorkBookProcessor.java class 内文件的方法。
在 workbook = new XSSFWorkbook(file);
行抛出异常
public void saveWorkbook (File file) throws Exception {
XSSFWorkbook workbook = null;
List<String> error = null;
try {
workbook = new XSSFWorkbook(file);
...... some more code........
} catch (Exception ex) {
logger.error("Error:", ex);
}
}
在执行上面的代码时,它会抛出以下 execption
2020-10-01 11:16:55.909 ERROR 15372 --- [onPool-worker-1] c.b.c.x.p.WorkBookProcessor : Error:
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
at org.apache.poi.POIXMLFactory.createDocumentPart(POIXMLFactory.java:63) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:580) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:165) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:270) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:323) ~[poi-ooxml-3.17.jar:3.17]
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_251]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_251]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_251]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_251]
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:56) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLFactory.createDocumentPart(POIXMLFactory.java:60) ~[poi-ooxml-3.17.jar:3.17]
... 14 common frames omitted
Caused by: java.io.IOException: Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data.
This may indicate that the file is used to inflate memory usage and thus could pose a security risk.
You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit.
Counter: 4099049, cis.counter: 40960, ratio: 0.00999256168930891
Limits: MIN_INFLATE_RATIO: 0.01
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.advance(ZipSecureFile.java:268) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:222) ~[poi-ooxml-3.17.jar:3.17]
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2919) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:303) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1895) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanQName(XMLEntityScanner.java:843) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:409) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:251) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:113) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:142) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:244) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339) ~[na:1.8.0_251]
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121) ~[na:1.8.0_251]
at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:140) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:163) ~[poi-ooxml-3.17.jar:3.17]
at org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument$Factory.parse(Unknown Source) ~[poi-ooxml-schemas-3.17.jar:3.17]
at org.apache.poi.xssf.model.StylesTable.readFrom(StylesTable.java:192) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.xssf.model.StylesTable.<init>(StylesTable.java:141) ~[poi-ooxml-3.17.jar:3.17]
... 20 common frames omitted
一件奇怪的事情是,如果我重新保存 .xlsm 文件,它会起作用
在进一步调试时,我发现它在读取和解析 xl\styles.xml 文件夹中的 styles.xml 文件时中断。
奇怪的是这个styles.xml内容和重新保存后有效的.xlsm文件styles.xml是一样的
非常感谢对此问题的任何见解。
如日志中所示,问题的根本原因是
原因:java.io.IOException:检测到 Zip 炸弹! 文件将超过最大值。压缩文件大小与扩展数据大小的比率。
这可能表明该文件用于增加内存使用量,因此可能会带来安全风险。
如果您需要处理超过此限制的文件,您可以通过 ZipSecureFile.setMinInflateRatio() 调整此限制。
计数器:4099049,cis.counter:40960,比率:0.00999256168930891
限制:MIN_INFLATE_RATIO:0.01
对代码进行以下更改解决了问题
import org.apache.poi.openxml4j.util.ZipSecureFile;
....
public WorkBookProcessor(
@Value("${zipSecureFile.minInflateRatio:0.009}") Double zipMinInflateRatio) {
this.couchbaseTemplate = couchbaseTemplate;
}
public void saveWorkbook (File file) throws Exception {
if (ZipSecureFile.getMinInflateRatio()>= zipMinInflateRatio) {
ZipSecureFile.setMinInflateRatio(zipMinInflateRatio);
}
XSSFWorkbook workbook = null;
List<String> error = null;
try {
workbook = new XSSFWorkbook(file);
...... some more code........
} catch (Exception ex) {
logger.error("Error:", ex);
}
}
我正在尝试使用 apache poi 读取 .xlsm 文件,该文件在 spring 引导应用程序 (JDK 1.8)
中运行以下是我在 build.gradle 文件
中的条目compile "org.apache.poi:poi:3.17"
compile "org.apache.poi:poi-ooxml:3.17"
这是尝试读取 WorkBookProcessor.java class 内文件的方法。 在 workbook = new XSSFWorkbook(file);
行抛出异常public void saveWorkbook (File file) throws Exception {
XSSFWorkbook workbook = null;
List<String> error = null;
try {
workbook = new XSSFWorkbook(file);
...... some more code........
} catch (Exception ex) {
logger.error("Error:", ex);
}
}
在执行上面的代码时,它会抛出以下 execption
2020-10-01 11:16:55.909 ERROR 15372 --- [onPool-worker-1] c.b.c.x.p.WorkBookProcessor : Error:
org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
at org.apache.poi.POIXMLFactory.createDocumentPart(POIXMLFactory.java:63) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:580) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:165) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:270) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:323) ~[poi-ooxml-3.17.jar:3.17]
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_251]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_251]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_251]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_251]
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:56) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLFactory.createDocumentPart(POIXMLFactory.java:60) ~[poi-ooxml-3.17.jar:3.17]
... 14 common frames omitted
Caused by: java.io.IOException: Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data.
This may indicate that the file is used to inflate memory usage and thus could pose a security risk.
You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit.
Counter: 4099049, cis.counter: 40960, ratio: 0.00999256168930891
Limits: MIN_INFLATE_RATIO: 0.01
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.advance(ZipSecureFile.java:268) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:222) ~[poi-ooxml-3.17.jar:3.17]
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2919) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:303) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1895) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanQName(XMLEntityScanner.java:843) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:409) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:251) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:113) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:142) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:244) ~[na:1.8.0_251]
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339) ~[na:1.8.0_251]
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121) ~[na:1.8.0_251]
at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:140) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:163) ~[poi-ooxml-3.17.jar:3.17]
at org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument$Factory.parse(Unknown Source) ~[poi-ooxml-schemas-3.17.jar:3.17]
at org.apache.poi.xssf.model.StylesTable.readFrom(StylesTable.java:192) ~[poi-ooxml-3.17.jar:3.17]
at org.apache.poi.xssf.model.StylesTable.<init>(StylesTable.java:141) ~[poi-ooxml-3.17.jar:3.17]
... 20 common frames omitted
一件奇怪的事情是,如果我重新保存 .xlsm 文件,它会起作用
在进一步调试时,我发现它在读取和解析 xl\styles.xml 文件夹中的 styles.xml 文件时中断。 奇怪的是这个styles.xml内容和重新保存后有效的.xlsm文件styles.xml是一样的
非常感谢对此问题的任何见解。
如日志中所示,问题的根本原因是
原因:java.io.IOException:检测到 Zip 炸弹! 文件将超过最大值。压缩文件大小与扩展数据大小的比率。 这可能表明该文件用于增加内存使用量,因此可能会带来安全风险。 如果您需要处理超过此限制的文件,您可以通过 ZipSecureFile.setMinInflateRatio() 调整此限制。 计数器:4099049,cis.counter:40960,比率:0.00999256168930891 限制:MIN_INFLATE_RATIO:0.01
对代码进行以下更改解决了问题
import org.apache.poi.openxml4j.util.ZipSecureFile;
....
public WorkBookProcessor(
@Value("${zipSecureFile.minInflateRatio:0.009}") Double zipMinInflateRatio) {
this.couchbaseTemplate = couchbaseTemplate;
}
public void saveWorkbook (File file) throws Exception {
if (ZipSecureFile.getMinInflateRatio()>= zipMinInflateRatio) {
ZipSecureFile.setMinInflateRatio(zipMinInflateRatio);
}
XSSFWorkbook workbook = null;
List<String> error = null;
try {
workbook = new XSSFWorkbook(file);
...... some more code........
} catch (Exception ex) {
logger.error("Error:", ex);
}
}