将XSSFWorkbook写入zip文件

use*_*910 12 java apache-poi zipoutputstream

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

  XSSFWorkbook workbook = new XSSFWorkbook();
  //add some data
  Zipoutputstream zipstream=new Zipoutputstream(//destination outputstream);
  workbook.write(zipstream);
Run Code Online (Sandbox Code Playgroud)

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

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

Klu*_*ßer 20

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

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();
Run Code Online (Sandbox Code Playgroud)

呼吁closeByteArrayOutputStream没有任何作用,仍然可以写入zos.


rge*_*man 4

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

zipstream.putNextEntry(new ZipEntry("example.xlsx"));
Run Code Online (Sandbox Code Playgroud)

然后你应该可以打电话

workbook.write(zipstream);
Run Code Online (Sandbox Code Playgroud)

但之后您需要在关闭流之前关闭条目。

zipstream.closeEntry();
Run Code Online (Sandbox Code Playgroud)

有关如何使用 Java 的 .Zip 文件的详细信息,请参阅“从 Java 写入和读取 .Zip 文件”ZipOutputStream

另请注意,.xlsx 文件已经是压缩的 zip 文件,因此将其放入 .zip 文件中可能不会对其进行很大程度的压缩。