Неверная подпись заголовка;IOException с Apache POI в документе Excel - PullRequest
12 голосов
/ 09 сентября 2010

Я получаю:

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);
    }

Я получаю ту же ошибку при попытке использования файлов Word и Power Point (также OLE2).

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

Ответы [ 5 ]

6 голосов
/ 18 августа 2011

Если перевернуть номер подписи, вы увидите байты начала вашего файла:

0x000201060000FFFE -> 0xFE 0xFF 0x00 0x00 0x06 0x01 0x02 00

Первые два байта выглядят как спецификация Unicode, 0xFEFF означает 16-разрядный байтовый порядок байтов. Затем у вас есть несколько младших байтов управления, шестнадцатеричные коды для 0, затем 258, а затем 2, так что, возможно, это не текстовый файл.

Этот файл на самом деле не является файлом OLE2, и POI прав, чтобы дать вам ошибку. Я не знаю, что это такое, но я предполагаю, что, возможно, он может быть частью файла OLE2 без внешней оболочки OLE2? Если вы можете открыть его с офисом, сделайте save-as, и POI должно быть в порядке, чтобы открыть это. Этот заголовок не является заголовком файла OLE2, поэтому POI не может открыть его для вас.

5 голосов
/ 21 ноября 2010

В моем случае файл представлял собой файл CSV, сохраненный с расширением .xls. Excel смог открыть его без проблем, но POI не было.

Если я найду лучшее / более общее решение, я вернусь и напишу его здесь.

1 голос
/ 14 августа 2015

, потому что вы сохранили свой файл в Excel 2013. сохранить как файл в формате Excel 97-2003.

1 голос
/ 21 января 2013

Попробуйте сохранить его как файл csv напрямую и использовать opencsv для своих операций.
Используйте следующую ссылку, чтобы узнать об opencsv.
http://opencsv.sourceforge.net/#what-is-opencsv

Excel можно открытьтаблица csv, xls или даже html, сохраненная как xls.

Таким образом, вы можете сохранить файл как file_name.csv и использовать opencsv для чтения файла в вашем коде.

Или вы можетефайл один раз в Excel, сохраните как книгу Excel 97-2003.

А затем, сама POI может прочитать файл: -)

0 голосов
/ 04 февраля 2014

У меня была такая же проблема с файлом xls, сгенерированным программным обеспечением, я вынужден сохранять файлы в Excel (того же формата), чтобы иметь возможность читать с помощью apache POI.

...