Java.io.IOException: не удалось прочитать источник записи zip при попытке открыть файл Excel с помощью Apache POI.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Java.io.IOException: не удалось прочитать источник записи zip при попытке открыть файл Excel с помощью Apache POI.

Сообщение Anonymous »

Я работаю над проектом Groovy, в котором мне нужно загрузить файл Excel с помощью Apache POI. Файл предоставлен третьей стороной, и я столкнулся с проблемой при попытке открыть его напрямую. Если я вручную открою файл в Excel и сохраню его, файл станет пригодным для использования, но я хочу автоматизировать этот процесс в своем коде.

Код: Выделить всё

    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
Я использую Apache POI версии 3.16.
Вот метод 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Пакет org.apache.poi.ss.usermodel доступен из более чем одного модуля: poi, poi.ooxml [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    241 Просмотры
    Последнее сообщение Anonymous
  • Пакет org.apache.poi.ss.usermodel доступен из более чем одного модуля: poi, poi.ooxml [закрыто]
    Anonymous » » в форуме Apache
    0 Ответы
    162 Просмотры
    Последнее сообщение Anonymous
  • Зависимость Apache POI в проекте Maven: java.lang.NoClassDefFoundError: не удалось инициализировать класс org.apache.poi
    Anonymous » » в форуме JAVA
    0 Ответы
    129 Просмотры
    Последнее сообщение Anonymous
  • Apache Poi `4.1.2` Файл PowerPoint Corrupt On Open, работал с Apache Poi` 3.17`
    Anonymous » » в форуме JAVA
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Apache Poi `4.1.2` Файл PowerPoint Corrupt On Open, работал с Apache Poi` 3.17`
    Anonymous » » в форуме JAVA
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»