Недопустимая подпись заголовка; IOException с POI Apache в документе excel
Я получаю:
java.io.IOException: недопустимая подпись заголовка; читать 0x000201060000FFFE, ожидается 0xE11AB1A1E011CFD0
при попытке добавить некоторые пользовательские свойства в документ Excel с помощью apache POI HPSF.
Я полностью уверен, что файл Excel OLE2 (а не HTML, XML или что-то еще, что Excel не жалуется).
Это важная часть моего кода:
try {
final POIFSFileSystem poifs = new POIFSFileSystem(event.getStream());
final DirectoryEntry dir = poifs.getRoot();
final DocumentEntry dsiEntry = (DocumentEntry)
dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);
final DocumentInputStream dis = new DocumentInputStream(dsiEntry);
final PropertySet props = new PropertySet(dis);
dis.close();
dsi = new DocumentSummaryInformation(props);
}
catch (Exception ex) {
throw new RuntimeException
("Cannot create POI SummaryInformation for event: " + event +
", path:" + event.getPath() +
", name:" + event.getPath() +
", cause:" + ex);
}
Я получаю ту же ошибку при попытке с файлами слов и Power Point (также OLE2).
Я полностью исключаю идеи, поэтому любая помощь/указатели очень приветствуются:)
Ответы
Ответ 1
Если вы перевернете номер подписки round, вы увидите байты начала вашего файла:
0x000201060000FFFE → 0xFE 0xFF 0x00 0x00 0x06 0x01 0x02 00
Первые два байта выглядят как спецификация Юникода, 0xFEFF означает 16 бит немного endian. Затем у вас есть несколько младших байтов управления, шестнадцатеричные коды для 0, затем 258, затем 2, поэтому, возможно, это не текстовый файл.
Этот файл действительно не является файлом OLE2, и POI прав, чтобы дать вам ошибку. Я не знаю, что это такое, но я предполагаю, что, возможно, это может быть частью файла OLE2 без внешней оболочки OLE2? Если вы можете открыть его в офисе, сделайте сохранение, и POI должен быть в порядке, чтобы открыть его. Как бы то ни было, этот заголовок не является заголовком файла OLE2, поэтому POI не может открыть его для вас.
Ответ 2
В моем случае файл был CSV файлом, сохраненным с расширением .xls
. Excel смог открыть его без проблем, но POI не был.
Если я нахожу лучшее/более общее решение, я вернусь и напишу его здесь.
Ответ 3
Попробуйте сохранить его как файл csv напрямую и используйте opencsv для своих операций.
Используйте следующую ссылку, чтобы узнать о opencsv.
http://opencsv.sourceforge.net/#what-is-opencsv
Excel может открыть таблицу csv, xls или даже html, сохраненную как xls.
Итак, вы можете сохранить файл как file_name.csv и можете использовать opencsv для чтения файла в вашем коде.
Или вы можете файл один раз в excel путем сохранения как Excel 97-2003.
И тогда сам POI может прочитать файл: -)
Ответ 4
потому что вы сохранили свой файл в Excel 2013. save Как ваш файл как формат excel 97-2003.
Ответ 5
У меня была та же проблема с файлом xls, сгенерированным программным обеспечением, я вынужден сохранять файлы с Excel (в том же формате), чтобы читать с apache POI.
Ответ 6
Я использовал файл .xlsx вместо .xls. Мы должны использовать файл .xls, если мы используем классы Workbook, Sheet и Row. Мой файл был .xlsx, который создал эту проблему, и я изменил его на .xls, он работал.