Apache POI - Как написать XSSFWorkbook в POIFSFileSystem?

Используя 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?


person kpk    schedule 05.07.2011    source источник


Ответы (1)


Вы не можете!

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 позаботится о том, чтобы вы связались с OCPackage, чтобы это произошло.

person Gagravarr    schedule 05.07.2011