14

私は今この問題を抱えています。この XSSFWorkbook (ワークブック) obj に保持されている Excel ファイルをリモート サーバーへの zip ファイル (example.zip 中にこの example.xlsx ファイルを含む) に書き込みたいと考えています。私は次のことを試みましたが、うまくいきませんでした.zipファイルにいくつかの奇妙なファイルを含むフォルダが作成されました

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

それで、これを行う正しい方法を知っている人はいますか?前もって感謝します

ps workbook.write(fileoutputstream) は機能しますが、必要に応じてzip内ではなく、test.xlsxなどのフラットファイルとしてローカルディスクにのみ書き込みます。

4

3 に答える 3

24

aaZipOutputStreamを に渡すXSSFWorkbook.writeと、ワークブックによってストリームがハイジャックされ、閉じられます。これは、それ自体が xml およびその他のファイルの zip アーカイブであるXSSFWorkbooka を書き込むため.xlsxです (.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();

を呼び出しcloseByteArrayOutputStreamも効果はなく、引き続き に書き込むことができますzos

于 2015-01-24T22:59:17.377 に答える
4

で必要なコールがいくつか欠落していますZipOutputStreamZipEntryスプレッドシート ファイルの を作成し、それを書き出す必要があります。次のようなものが必要になります

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

その後、あなたは呼び出すことができるはずです

workbook.write(zipstream);

ただし、その後、ストリームを閉じる前にエントリを閉じる必要があります。

zipstream.closeEntry();

Javaの .zip ファイルの使用方法の詳細については、「Java からの .Zip ファイルの書き込みと読み取り」を参照してくださいZipOutputStream

また、.x​​lsx ファイルは既に圧縮された zip ファイルであるため、.zip ファイルに配置してもあまり圧縮されない可能性があることに注意してください。

于 2013-05-23T18:25:07.193 に答える