两次写入输出流时 POI 损坏文件
POI corrupts file when writing twice to output stream
我的要求是创建一个工作簿对象,然后将一个 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;
如果我先将流写入文件,然后将 byteArrayOutputStream 作为附件发送,则附件已损坏,当我打开它时警告我文件已损坏,如果我说可以正确打开文件。生成的文件完全没问题。
如果我先发送附件然后保存excel到文件系统。然后附件保持正常并正常打开,但文件系统上的文件已损坏
那是当我写同一个工作簿两次时,它破坏了第二次出现的写入。
我也尝试将不同的工作簿对象传递给这两个步骤,在这种情况下它可以正常工作。
我正在寻找一种解决方案,我可以在写入另一个对象之前将 XSSFWorkbook 对象或其内容复制到一个单独的对象 excel。
目前我使用了一个变通方法在将同一个 excel 文件写入文件
后重新加载它
workBook = new XSSFWorkbook(new FileInputStream(metricFile));
根据你的描述,这听起来确实像是最近也困扰我的 POI 错误,即 this one。它在 POI 3.11-beta1 中得到修复,2014 年 12 月 21 日发布了稳定的 3.11 版 POI。所以我认为你最好的策略是升级你的 POI 版本,而不是试图产生一些 hack 来解决这个问题。
我的要求是创建一个工作簿对象,然后将一个 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;
如果我先将流写入文件,然后将 byteArrayOutputStream 作为附件发送,则附件已损坏,当我打开它时警告我文件已损坏,如果我说可以正确打开文件。生成的文件完全没问题。
如果我先发送附件然后保存excel到文件系统。然后附件保持正常并正常打开,但文件系统上的文件已损坏
那是当我写同一个工作簿两次时,它破坏了第二次出现的写入。
我也尝试将不同的工作簿对象传递给这两个步骤,在这种情况下它可以正常工作。
我正在寻找一种解决方案,我可以在写入另一个对象之前将 XSSFWorkbook 对象或其内容复制到一个单独的对象 excel。
目前我使用了一个变通方法在将同一个 excel 文件写入文件
后重新加载它 workBook = new XSSFWorkbook(new FileInputStream(metricFile));
根据你的描述,这听起来确实像是最近也困扰我的 POI 错误,即 this one。它在 POI 3.11-beta1 中得到修复,2014 年 12 月 21 日发布了稳定的 3.11 版 POI。所以我认为你最好的策略是升级你的 POI 版本,而不是试图产生一些 hack 来解决这个问题。