Apache POI - 如何将XSSFWorkbook写入POIFSFileSystem?

时间:2011-07-05 18:26:32

标签: apache-poi xssf

使用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()的{​​{1}}和/或writeFilesystem()方法中。有人可以告诉我如何使用POIFSFileSystem撰写XSSFWorkbook吗?

1 个答案:

答案 0 :(得分:4)

你不能!

POIFSFileSystem与OLE2文件一起使用,例如.xls,.doc,.ppt,.msg等.POIFS代码处理为您读取和写入各个流。

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

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

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

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