1

使用 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()办法。
我试图ByteArrayInputStreamXSSFWorkbook这样创建 -

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. 有人可以让我知道如何写XSSFWorkbookusingPOIFSFileSystem吗?

4

1 回答 1

4

你不能!

POIFSFileSystem 适用于 OLE2 文件,例如 .xls、.doc、.ppt、.msg 等。POIFS 代码为您处理其中的各个流的读取和写入。

对于 OOXML 文件(.xlsx、.docx、.pptx 等),文件的容器不再是 OLE2。相反,文件存储在 Zip 容器中。在 POI 中,这是由 OPCPackage 处理的,它负责读取和写入具有所需 OOXML 元数据的 Zip 文件。

如果要将 XSSF 文件写入磁盘,只需执行以下操作:

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

XSSFWorkbook 将处理与 OPCPackage 的对话,让您实现这一目标。

于 2011-07-05T21:38:48.007 回答