java.io.IOException:无法读取zip条目源

时间:2017-10-17 18:28:47

标签: java excel apache-poi

FileInputStream file = new FileInputStream("/file/path/report.xlsx"); 
XSSFWorkbook wb = new XSSFWorkbook(file); --!ERROR LINE!--

我在第二行收到错误。我查看了不同的在线资源,例如:

Error reading Excel .XLSX with Apache POI

Exception in thread "main" java.io.IOException: Failed to read zip entry source
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:106)
    at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:342)
    at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:285)
    at test.test.main(test.java:48)
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: 1483367, cis.counter: 14796, ratio: 0.009974605070761314Limits: MIN_INFLATE_RATIO: 0.01
    at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.advance(ZipSecureFile.java:257)
    at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:214)
    at java.io.FilterInputStream.read(Unknown Source)
    at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.<init>(ZipInputStreamZipEntrySource.java:132)
    at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:56)
    at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:99)
    ... 4 more

我添加了 ZipSecureFile.setMinInflateRatio(0.009);

   FileInputStream file = new FileInputStream("/file/path/report.xlsx"); 
   ZipSecureFile.setMinInflateRatio(0.009);
   XSSFWorkbook wb = new XSSFWorkbook(file);

它工作了一段时间,然后它开始抛出相同的错误

感谢任何帮助或指导。

1 个答案:

答案 0 :(得分:4)

添加以下行就是我的诀窍。

ZipSecureFile.setMinInflateRatio(-1.0d); 

代码如下:

FileInputStream file = new FileInputStream("/file/path/report.xlsx"); 
ZipSecureFile.setMinInflateRatio(-1.0d);
XSSFWorkbook wb = new XSSFWorkbook(file);