【问题标题】:POI corrupts file when writing twice to output stream两次写入输出流时 POI 损坏的文件
【发布时间】:2015-01-02 22:43:47
【问题描述】:

我的要求是创建一个工作簿对象,然后将 xlsx 文件保存到文件系统,然后将相同的工作簿对象作为电子邮件附件发送。

我做了什么:

创建一个工作簿对象:

XSSFWorkbook workBook = excelGenerator.createWorkBook(output);
 saveToFile(input, workBook);
 mailSender.sendNotificationWithAttachment(input, excelGenerator.saveToByteArray(workBook), emailId);

在哪里 saveToFile():

File metricFile = new File(metricsDirectory, filename + ".xlsx");
 try{
     FileOutputStream fileOut =new FileOutputStream(metricFile);
     workBook.write(fileOut);
     fileOut.flush();
     fileOut.close();
 }

saveToByteArray():

 ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
 try {
     workBook.write(byteOutputStream);
 } catch (IOException e) {
 }
 return byteOutputStream;
    1234563 .并且生成的文件非常好。
  1. 如果我先发送附件,然后将 excel 保存到文件系统。然后附件仍然正常并正常打开,但文件系统上的文件已损坏

也就是说,当我两次编写同一个工作簿时,它会破坏第二次写入。

我也尝试将不同的工作簿对象传递给两个步骤,在这种情况下它可以正常工作。

我正在寻找一种解决方案,我可以在其中将 XSSFWorkbook 对象或其内容复制到单独的对象,然后再写入另一个 excel。

目前我使用一种解决方法在将相同的 excel 文件写入文件后重新加载它

     workBook = new XSSFWorkbook(new FileInputStream(metricFile));

【问题讨论】:

  • 您使用的是 Java 7+ 吗?如果是,为什么不使用 java.nio.file?
  • 您使用哪个版本的 POI?
  • 我使用的是 POI 3.10,是的,我使用的是 JAVA 7,我想问题出在 poi 工作簿的写入方法上。还是我应该先尝试使用 nio.file
  • 问题与 nio 包无关。应该弄清楚如何使用write 方法两次而不会损坏。因为您使用相同的对象来调用可能导致问题的write 方法
  • @ViMatviichuk 是的,这与 nio 无关,但另一个问题是 2015 年编写的新代码仍然使用 File。 java.nio.file 现在已经 4 岁了,而且好多了。

标签: java apache-poi


【解决方案1】:

从你的描述来看,这听起来确实像是一个 POI 错误,最近也咬了我一口,即this one。它在 POI 3.11-beta1 中得到修复,并在 21.12.2014 上发布了稳定的 POI 3.11 版本。所以我认为你最好的策略是升级你的 POI 版本,而不是试图产生一些破解来解决这个问题。

【讨论】:

  • 感谢 POI 3.11 版本似乎可以正常工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2018-06-05
  • 2014-02-16
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多