【问题标题】:Apache POI - How to write XSSFWorkbook to POIFSFileSystem?Apache POI - 如何将 XSSFWorkbook 写入 POIFSFileSystem?
【发布时间】:2011-07-05 18:26:31
【问题描述】:

使用 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() 方法。
我试图像这样从XSSFWorkbook 创建ByteArrayInputStream -

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 文件进行纯文本比较(不提取)时,字节几乎没有差异。

所以问题应该出在POIFSFileSystemcreateDocument() 和/或writeFilesystem() 方法中。有人可以告诉我如何使用POIFSFileSystemXSSFWorkbook 吗?

【问题讨论】:

    标签: apache-poi xssf


    【解决方案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 将处理与 OPCPackage 的对话,让您实现这一目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多