Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在向输出流写入两次时,POI会损坏文件_Java_Apache Poi - Fatal编程技术网

Java 在向输出流写入两次时,POI会损坏文件

Java 在向输出流写入两次时,POI会损坏文件,java,apache-poi,Java,Apache Poi,我的要求是创建一个工作簿对象,然后将xlsx文件保存到文件系统,然后将同一工作簿对象作为电子邮件附件发送 我所做的: 创建工作簿对象: XSSFWorkbook workBook = excelGenerator.createWorkBook(output); saveToFile(input, workBook); mailSender.sendNotificationWithAttachment(input, excelGenerator.saveToByteArray(workBook

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

我所做的:

创建工作簿对象:

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

saveToByteArray():

  • 如果我首先将流写入文件,然后将byteArrayOutputStream作为附件发送,则附件已损坏,当我打开它时,它会向我发出文件已损坏的警告,如果我说“确定”,它将正确打开文件。生成的文件非常好

  • 如果我先发送附件,然后将excel保存到文件系统。然后附件保持正常并正常打开,但文件系统上的文件已损坏

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

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

    我正在寻找一种解决方案,在写入另一个excel之前,可以将XSSFWorkbook对象或其内容复制到另一个对象

    目前,我使用了一种变通方法,在将同一个excel文件写入文件后重新加载该文件

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

    从你的描述来看,这听起来真的像一个最近也咬了我的POI bug,即。POI 3.11-beta1中对其进行了固定,并于2014年12月21日发布了稳定的POI 3.11版本。所以我认为你最好的策略是升级你的POI版本,而不是试图制造一些黑客来解决这个问题

    您正在使用Java7+?如果是,为什么不使用java.nio.file?您使用哪一版本的POI?我使用的是POI 3.10,是的,我使用的是Java7,我想问题在于POI工作簿写入方法。或者我应该尝试使用nio.file firstproblem与nio包无关。应该弄清楚如何使用
    write
    方法两次而不发生损坏。因为调用
    write
    方法时使用了相同的对象,这可能会导致issue@ViMatviichuk是的,这与nio无关,但2015年编写的新代码仍然使用文件,这是另一个问题。java.nio.file现在已经有4年历史了,而且比以前好多了。感谢您,POI 3.11版本似乎运行得很好
     ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
     try {
         workBook.write(byteOutputStream);
     } catch (IOException e) {
     }
     return byteOutputStream;
    
         workBook = new XSSFWorkbook(new FileInputStream(metricFile));