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

Недопустимая подпись заголовка; 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).

Я полностью исключаю идеи, поэтому любая помощь/указатели очень приветствуются:)

4b9b3361

Ответ 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, он работал.