Поврежденная обработка файлов
Я хотел бы знать, есть ли у кого-нибудь советы по работе с поврежденными файлами с 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 вообще.
- Файл отправлен.
- Программа запускается.
- Обрабатывает ошибку.
- обрабатывает данные.
Ответы
Ответ 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, если это поможет. У него есть аналогичная проблема (ы), и вы можете найти ответ о том, как с ним справиться.