如何在java中从工作簿对象获取inputStream

如何在java中从工作簿对象获取inputStream,java,excel,apache-poi,Java,Excel,Apache Poi,上载文件时,我将输入流传递到工作簿。现在,我想在另一种方法中使用工作簿中的InputStream,比如save,我将文件InputStream保存到DB中。这是我的密码 public void FileUpload(FileUploadEvent event) throws ParseException { UploadedFile item = event.getUploadedFile(); Workbook workbook = org.apache.poi.ss.use

上载文件时,我将输入流传递到工作簿。现在,我想在另一种方法中使用工作簿中的
InputStream
,比如save,我将文件
InputStream
保存到DB中。这是我的密码

public void FileUpload(FileUploadEvent event) throws ParseException  {
    UploadedFile item = event.getUploadedFile();
    Workbook workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(item.getInputStream());
}
现在我想将工作簿对象作为实例变量并传递给另一个方法,如下所示

public String save() throws SQLException, IOException{
    fileId = dao.savefile(workbook,fileName);
}
在我的savefile方法中

InputStream inptest=  **workbook.getStream**
    ps.setBinaryStream(2,fin,fin.available()); 

因此,
inptest
变量接受我想从工作簿中获取的
InputStream

如果您试图将工作簿对象保存到文件中,有一种方法可以接收OutputStream。保存到文件可以通过以下步骤完成:

FileOutputStream fos = new FileOutputStream("path/to/file/[filename]");
workbook.write(fos);
fos.close();

听起来您想要的是一种将InputStream用于多种用途的方法:

  • 创建工作簿对象(您已经在执行此操作)
  • 将输入流的内容保存到其他地方
  • 由于从InputStream读取通常是一次性操作,不能重复,因此您可以执行以下操作:

  • 将InputStream的完整内容保存到缓冲区
  • 从缓冲区打开两个新的InputStreams
  • 将输入流传递给这两个方法
  • 代码可能如下所示:

    public void FileUpload(FileUploadEvent event) throws ParseException  {
        UploadedFile item = event.getUploadedFile();
        InputStream originalInputStream = item.getInputStream();
    
        byte[] buffer = IOUtils.toByteArray(originalInputStream);
        InputStream is1 = new ByteArrayInputStream(buffer);
        InputStream is2 = new ByteArrayInputStream(buffer);
    
        Workbook workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(is1);
    }
    
    InputStream inptest = is2;
    ps.setBinaryStream(2,fin,fin.available()); 
    

    注意:这用于IOUtils。

    什么库和包是
    工作簿
    ?我使用的是poi-ooxml-3.9.jar。具体问题是什么?如何从工作簿读取输入流。它应该可以工作,但这取决于您尝试执行的操作。您可能还需要关闭FileOutputStream以显示文件。我想你不清楚我的问题。我想从工作簿中读取inputstream,所以让我们假设,根据我写入工作簿的代码,那么如何从中获取inputstream。请告诉我是否有这样的方法。您的意思是从工作簿对象检索原始InputStream吗?据我所知,没有办法这样做。如果要将其保留到savefile方法,还应将其添加为实例变量。是从工作簿对象检索原始InputStream。无论如何,谢谢你的时间。很高兴它起作用了!如果某个解决方案对您有效,这里的常见礼仪是单击复选标记将答案标记为已接受。看见