Apache POI - Как написать XSSFWorkbook для POIFSFileSystem? - PullRequest
1 голос
/ 05 июля 2011

Используя Apache POI HSSF, мы можем создать файл xls, подобный этому

private void write(HSSFWorkbook workbook) {
    POIFSFileSystem filesystem = new POIFSFileSystem();
    filesystem.createDocument(new ByteArrayInputStream(workbook.getBytes()), 
                    "Workbook");
    FileOutputStream stream = new FileOutputStream("test.xls");
    filesystem.writeFilesystem(stream);
}

Точно так же, как я могу написать с XSSFWorkbook?У него нет метода getBytes().
Я пытался создать ByteArrayInputStream из XSSFWorkbook следующим образом -

ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.write(baos); //XSSFWorkbook here
ByteArrayInputStream bias = new ByteArrayInputStream(baos.toByteArray());

Но созданный файл xlsx был поврежден.Как я могу записать книгу на диск, используя POIFSFileSystem?

Тот же XSSFWorkbook был успешно записан, когда я это сделал -

FileOutputStream stream = new FileOutputStream("test.xlsx");
workbook.write(stream);

Когда я извлек и сравнил файлы xlsxРазницы не было.Тем не менее, когда я выполняю простое сравнение текста непосредственно в файлах xlsx (без извлечения), различия в байтах незначительны.

Поэтому проблема должна заключаться в методах createDocument() и / или writeFilesystem()POIFSFileSystem.Может кто-нибудь дать мне знать, как писать XSSFWorkbook, используя POIFSFileSystem?

1 Ответ

4 голосов
/ 06 июля 2011

Вы не можете!

POIFSFileSystem работает с файлами OLE2, такими как .xls, .doc, .ppt, .msg и т. Д. Код POIFS обрабатывает чтение и запись отдельных потоков в этом для вас.

В случае файлов OOXML (.xlsx, .docx, .pptx и т. Д.) Контейнер для файла больше не является OLE2.Вместо этого файлы хранятся в контейнере Zip.В POI это обрабатывается OPCPackage, который заботится о чтении и записи из Zip-файлов с необходимыми метаданными OOXML.

Если вы хотите записать XSSF-файл на диск, просто выполните:

FileOutputStream stream = new FileOutputStream("test.xlsx");
workbook.write(stream);
stream.close();

И XSSFWorkbook проведет разговор с OPCPackage, чтобы вы могли это сделать.

...