Apache POI Недопустимая подпись заголовка при открытии Excel XML

Можно ли открыть excel xml (xml, который можно открыть в Microsoft Office Excel), и это совершенно хороший xml, соответствующий справочник по XML-таблице

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

String outputFile = "output.xml";
FileInputStream file = new FileInputStream( new File( outputFile ) );
Workbook wb = WorkbookFactory.create( new POIFSFileSystem( file ) );
Sheet sheet = wb.getSheetAt(0);

Это показывает мне следующее исключение:

java.io.IOException: Invalid header signature; read 0x6576206C6D783F3C, expected 0xE11AB1A1E011CFD0
    at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
    at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:104)
    at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:138)

person SomeDude    schedule 12.07.2016    source источник
comment
Можете ли вы попробовать с Apache POI 3.15 beta 2? Это имеет тенденцию давать более полезные сообщения об ошибках с неподдерживаемыми файлами. Кроме того, почему вы используете InputStream, когда у вас есть файл? Он использует больше памяти и работает медленнее!   -  person Gagravarr    schedule 13.07.2016
comment
@Gagravarr К сожалению, я не могу использовать 3.15, и использование файла или потока ввода не имеет значения. Выдает ту же ошибку. Итак, кажется, что 3.9 или 3.6 не могут обрабатывать excel xml?   -  person SomeDude    schedule 13.07.2016


Ответы (1)


Кажется, в новых версиях Excel часто используется шифрование. Для меня работает следующий код

InputStream fin = new FileInputStream(xlsFile);
BufferedInputStream in = new BufferedInputStream(fin);
if (POIFSFileSystem.hasPOIFSHeader(in)) {
    // if there is any encryption
    POIFSFileSystem fs = new POIFSFileSystem(in);
    EncryptionInfo info = new EncryptionInfo(fs);
    Decryptor d = Decryptor.getInstance(info);
    d.verifyPassword(Decryptor.DEFAULT_PASSWORD);
    workbook = WorkbookFactory.create(d.getDataStream(fs));
}
else
    // without encryption
    workbook = WorkbookFactory.create(in);
person OkieOth    schedule 12.07.2016
comment
Это не работает для меня. Я все еще получаю ту же ошибку. Сейчас перехожу на парсер. - person SomeDude; 12.07.2016
comment
@svasa, если вы можете опубликовать файл Excel, я могу завтра провести с ним простой тест. - person OkieOth; 12.07.2016
comment
Извините, я не могу опубликовать свой файл. Но спасибо за вклад. - person SomeDude; 12.07.2016
comment
WorkbookFactory также должен обрабатывать зашифрованные файлы — второй необязательный аргумент - это пароль для расшифровки - person Gagravarr; 13.07.2016