Код: Выделить всё
java.io.IOException: Failed to read zip entry source
at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:103)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:185)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:144)
at com.apsec.groovy.job.util.POIUtil.openWorkbook(POIUtil.groovy:60)
at com.apsec.groovy.job.axiom.AxiomAToMReportV2Load.run(AxiomAToMReportV2Load.groovy:213)
at com.apsec.groovy.job.AbstractJob.run(AbstractJob.groovy:67)
at com.apsec.groovy.job.developer.LocalEnvironment.run(LocalEnvironment.groovy:106)
at com.apsec.groovy.job.axiom.AxiomAToMReportV2Load.main(AxiomAToMReportV2Load.groovy:359)
Caused by: java.util.zip.ZipException: invalid entry size (expected 0 but got 1053 bytes)
at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java:384)
at java.util.zip.ZipInputStream.read(ZipInputStream.java:196)
at org.apache.poi.openxml4j.util.ZipSecureFile$ThresholdInputStream.read(ZipSecureFile.java:219)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource$FakeZipEntry.(ZipInputStreamZipEntrySource.java:132)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.(ZipInputStreamZipEntrySource.java:56)
at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:100)
... 8 more
Вот метод openWorkbook, который я использую:
Код: Выделить всё
import org.apache.poi.ss.usermodel.Workbook
import org.apache.poi.ss.usermodel.WorkbookFactory
import org.apache.poi.openxml4j.util.ZipSecureFile
import org.apache.poi.openxml4j.exceptions.InvalidFormatException
import groovy.util.logging.Slf4j
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.io.FileNotFoundException
@Slf4j
static Workbook openAndRepairWorkbook(File file) throws FileNotFoundException, IOException, InvalidFormatException {
FileInputStream fis = null
Workbook workbook = null
File repairedFile = new File(file.getParent(), "repaired_" + file.getName())
try {
if (!file.exists() || !file.canRead()) {
log.error("File does not exist or cannot be read: {}", file.getAbsolutePath())
throw new FileNotFoundException("File does not exist or cannot be read: " + file.getAbsolutePath())
}
log.info("Attempting to open workbook from file: {}", file.getAbsolutePath())
fis = new FileInputStream(file)
ZipSecureFile.setMinInflateRatio(0.0001) // Adjust the zip bomb detection threshold
try {
workbook = WorkbookFactory.create(fis)
log.info("Workbook successfully opened.")
// Save the workbook to a new file to "repair" it
log.info("Saving workbook to repaired file: {}", repairedFile.getAbsolutePath())
FileOutputStream fos = new FileOutputStream(repairedFile)
workbook.write(fos)
fos.close()
workbook.close()
// Reopen the repaired file
log.info("Reopening the repaired workbook.")
fis = new FileInputStream(repairedFile)
workbook = WorkbookFactory.create(fis)
log.info("Repaired workbook successfully opened.")
} catch (InvalidFormatException e) {
log.error("InvalidFormatException encountered: {}", e.getMessage())
throw e
} catch (IOException e) {
log.error("IOException encountered: {}", e.getMessage())
throw e
}
} finally {
if (fis != null) {
try {
fis.close()
} catch (IOException e) {
log.error("Error closing FileInputStream: {}", e.getMessage())
}
}
}
return workbook
}
Исправление вручную:
Если я откройте проблемный файл Excel в Microsoft Excel и просто сохраните его, не внося никаких изменений. Мой код может без проблем обработать файл.
Программная попытка:
Я пробовал чтобы программно имитировать ручной процесс, открыв книгу, сохранив ее в новом файле, а затем повторно открыв восстановленный файл с помощью метода openAndRepairWorkbook, показанного выше. Однако я по-прежнему сталкиваюсь с той же ошибкой.
Что мне нужно
Я хотел бы найти способ решить эту проблему программно, не открывая и не сохраняя файл в Excel вручную. В идеале я хотел бы:
Определить основную причину IOException, связанную с источником записи zip.
Реализовать решение, которое позволит моему коду открывать, исправлять и обработать файл автоматически.
Кто-нибудь сталкивался с подобной проблемой или есть какие-либо предложения по ее решению? Будем очень признательны за любую помощь или подсказки.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/787 ... en-an-exce