Подтвердить что ты не робот

Поврежденная обработка файлов

Я хотел бы знать, есть ли у кого-нибудь советы по работе с поврежденными файлами с Apache POI

Я пытаюсь открыть файл и получаю это сообщение:

Exception in thread "main" org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException: Initialisation of record 0x1C left 2 bytes remaining still to be read.
    at org.apache.poi.hssf.record.RecordInputStream.hasNextRecord(RecordInputStream.java:156)
    at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:231)
    at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:480)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:301)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:95)
    at ExcelImporter.EditFileImportDialog.main(EditFileImportDialog.java:409)

Вот SSCCE

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class EditFileImportDialog {

    /* Omitted irrelevent code */

    public static void main(String[] args) {
        File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls");
        try {
            Workbook wb = WorkbookFactory.create(file);  // Line 409 for ref to the exception stack trace
            System.out.println(wb);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Это происходит только с этим файлом, и исключение не возникает, если я открываю файл в excel и сохраняю его, а затем пытаюсь открыть его с помощью POI. Любое предложение относительно того, как я мог бы справиться с этим?

EDIT:

В качестве примечания моя проблема может быть связана с этим вопросом, но обновление POI не исправило мою проблему, и есть разнородности с описанным файлом. Я искал для подобных ответов, но, возможно, если кто-то знает, что не так с самим файлом excel, я могу написать что-то, чтобы исправить файл.

РЕДАКТИРОВАТЬ 2

Создание файла не входит в мой контроль. Excel исправляет сам файл только после его открытия и повторного сохранения. Мой вопрос заключается в том, может ли кто-нибудь подумать о том, как настроить/увеличить POI для обработки этого поврежденного файла таким же образом, чтобы excel смог исправить эту проблему.

РЕДАКТИРОВАТЬ 3

В ответ на несколько комментариев/ответов:

Моя конечная цель состояла бы в том, чтобы не использовать excel вообще.

  • Файл отправлен.
  • Программа запускается.
  • Обрабатывает ошибку.
  • обрабатывает данные.
4b9b3361

Ответ 1

Вы можете попробовать использовать HSSFWorkbook для открытия файлов .xls.

Вы можете использовать следующий код, чтобы проверить, как POI отвечает на определение формата xls.

private boolean isExcel(InputStream i) throws IOException {
return (POIFSFileSystem.hasPOIFSHeader(i) || POIXMLDocument.hasOOXMLHeader(i));
}

Я бы использовал:

InputStream input = new FileInputStream(fileName);

Вместо:

File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls");

Вы проверили, что не так с ячейкой 0x1C в вашем файле?

Ответ 2

Исключение в структуре потока не является проблемой кодирования. Вы должны заменить неправильные ссылки на ячейки в Excel-Workbook!

Исключение в потоке "main" org.apache.poi.hssf.record.RecordInputStream $LeftoverDataException: Инициализация записи 0x23 оставила 12 байт, которые еще не читаются.

Это исключение возникает, когда я пытаюсь открыть книгу Excel-Workbook с POI HSSF, которая содержит ссылку на ячейку DDE. У меня есть эта проблема с типом ссылки на ячейку "Excel.Type.12", например: = Excel.Sheet.12 |! '\ Имя_сервера\путь\Workbook.xlsx' '! SheetName Z23S22

Обходной путь: замените ссылку ссылкой типа "Лист", например: = 'Диск:\путь к файлу [Workbook.xlsx] SheetName'! $V $23

Сохраните свою книгу и повторите попытку.

Ответ 3

Лучшим вариантом было бы создать новый файл и заставить вспомнить, что вы закрываете файл перед выполнением программы. Это было бы самым простым решением.

Ответ 4

Попробуйте создать XSSFWorkbook вместо этого из FileInputStream.

С изменениями ваш образец будет выглядеть так:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class EditFileImportDialog {

    /* Omitted irrelevent code */

    public static void main(String[] args) {
        String file = "Z:\\Path\\To\\File_causing_the_trouble.xls";
        try {
            InputStream databaseFile = new FileInputStream(file);
            XSSFWorkbook  wb = new XSSFWorkbook(databaseFile);  
            System.out.println(wb);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Ответ 5

Возможно, вы уже проверили, но если нет, см. https://bz.apache.org/bugzilla/show_bug.cgi?id=47251, если это поможет. У него есть аналогичная проблема (ы), и вы можете найти ответ о том, как с ним справиться.