将 XSSFWorkbook 写入 zip 文件

2022-09-03 10:10:10

我现在有这个问题。我想将这个XSSFWorkbook(工作簿)obj中的excel文件保留写入一个zip文件,例如(示例.zip同时包含此示例.xlsx文件)到远程服务器。我尝试过以下操作,但没有工作,它创建了一个文件夹,其中包含zip文件中的一些奇怪文件

  XSSFWorkbook workbook = new XSSFWorkbook();
  //add some data
  Zipoutputstream zipstream=new Zipoutputstream(//destination outputstream);
  workbook.write(zipstream);

那么有谁知道这样做的正确方法是什么?提前致谢

ps workbook.write(fileoutputstream)可以工作,但它只作为平面文件写入本地磁盘,例如test.xlsx而不是我需要的zip内部。


答案 1

将 a 传递到将导致流被工作簿劫持和关闭。这是因为一个写入它本身就是xml和其他文件的zip存档(您可以解压缩任何.xslx以查看其中的内容)。如果您能够将excel文件放入内存中,我发现这很有效:ZipOutputStreamXSSFWorkbook.writeXSSFWorkbook.xlsx

ZipOutputStream zos = new ZipOutputStream(//destination outputstream);
zos.putNextEntry(new ZipEntry("AnExcelFile.xlsx"));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
workbook.write(bos);
bos.writeTo(zos);
zos.closeEntry();
// Add other entries as needed
zos.close();

调用没有效果,仍然可以写入 。closeByteArrayOutputStreamzos


答案 2

您错过了 一些必要的呼叫。您需要为电子表格文件创建一个,然后将其写出。您将需要类似的东西ZipOutputStreamZipEntry

zipstream.putNextEntry(new ZipEntry("example.xlsx"));

那么你应该能够打电话

workbook.write(zipstream);

但在此之后,您需要在关闭流之前关闭入口。

zipstream.closeEntry();

请参阅“写入和读取”。Zip File From Java“,了解有关如何使用 Java 的 .ZipOutputStream

另外,请注意,.xlsx文件已经是压缩的zip文件,因此将其放在.zip文件中可能不会对其进行太多压缩。


推荐