首页 新闻 会员 周边

OutputStream和InputStream转换问题---请高手支招

0
悬赏园豆:100 [已解决问题] 解决于 2013-04-16 21:33

问题描述:现用代码生成了个Excel文件,把该文件写入到了InputSteam流中,将该字节流以blob类型存到了数据库中,需要导出该Excel时可以在数据库中查出该流,查出时已经是OutputStream了,如果直接导出,当然OutputStream是没有问题的,可以直接用来导出,但问题是此时我不需要直接导出,而是需要得到原来的Excel文档对象,对其中的数据加以利用,请高手支招,怎样才能根据查询出的OutputStream流来解析出原来的Excel文档对象。

相关代码如下:

//生成Excel文档并将InputStream流存在数据库中
ByteArrayOutputStream os = new ByteArrayOutputStream();
WritableWorkbook workbook = null;
try {   
  workbook = Workbook.createWorkbook(os); WritableSheet[] sheets = new WritableSheet[3]; sheets[0] = workbook.createSheet("sheet1", 0); sheets[1] = workbook.createSheet("sheet2", 1); sheets[2] = workbook.createSheet("sheet3", 2); // 生成Excel文档信息 writeScheduleSheetDocument(sheets, caScheduleSheet, true); workbook.write(); workbook.close(); InputStream is = new java.io.ByteArrayInputStream(os.toByteArray()); //将InputStream流is保存到数据库中 getDocumentDao().saveDocument(caScheduleSheet.getObjectid(), is, os.toByteArray().length, caScheduleSheet.getCoperator()); } catch (Exception e) { }


如果需要导出该Excel文档时可以这样操作

OutputStream output = null;
HttpServletResponse response = null;
try {
    response = (HttpServletResponse) context.getExternalContext().getResponse();
    output = response.getOutputStream();
    //查询出之前存储在数据库中的Excel文档流,把数据放在output中        
     ServiceManager.getScheduleSheetService().querySheetDocument(objectids[objectids.length-1], output);
    String fileName = schedulesheetno[schedulesheetno.length-1] + ".xls";
    fileName = java.net.URLEncoder.encode(fileName, "utf-8");
    response.setHeader("Content-disposition", "attachment;filename=" + fileName);
    response.setContentType("application/vnd.ms-excel");
    response.flushBuffer();
    context.getApplication().getStateManager().saveView(context);
    context.responseComplete();
    } catch (Exception e) {
logger.info("导出excel失败", e);
}


上面导出Excel的代码是没有问题的可以导出原来的Excel文档,请高手支招怎样才能根据查询出来的output流来得到原来的Excel文档对象。

  注:

     1、有人可能会说生成Excel文档时就把该文档保存下来,使用时直接取来用就行,但是根据用户需要不能保存到服务器上,因为这样的文档会有成千上万,只能存在数据库中,需要时取出来用。

     2、我想知道如果查询出来的是InputStream而不是OutputStream是否就可以解析出原来的Excel文档对象,因为我知道可以这样:

WritableWorkbook workbook = null;
InputStream is  //如果is为查询出来的流
workbook = Workbook.getWorkbook(is)

如果上述方法可以的话,其实就是将OutputStream转化为InputStream流,但是我查了一下午也没查到怎样才能转化过来,如果可以请高手们提供方法,多谢!    至于能不能直接查询出InputStream其实我现在还没搞出来,有可能查出的就只能是OutputStream流。

问题简化:上面说了这么多,其实就是下面问题:

              把Excel文档写入InputStream流中,把InputStream流保存到数据库中,使用时查出来的是OutputStream流,怎样根据OutputStream流来得到原Excel文档对象

 

 请高手们多多指教呀,小弟在此先谢谢了!

web
fresh-fresh的主页 fresh-fresh | 初学一级 | 园豆:114
提问于:2013-04-14 23:00
< >
分享
最佳答案
0

从数据库中已查出InputStream类型,所以直接可得到Excel文档对象,根据

WritableWorkbook workbook = null;
InputStream is  //如果is为查询出来的流
workbook = Workbook.getWorkbook(is)

问题已自己解决

fresh-fresh | 初学一级 |园豆:114 | 2013-04-16 21:28
其他回答(1)
0

楼主看一下NPOI吧,可以直接加载数据流为Excel文档。

收获园豆:100
I,Robot | 园豆:9783 (大侠五级) | 2013-04-14 23:08

谢谢推荐!

支持(0) 反对(0) fresh-fresh | 园豆:114 (初学一级) | 2013-04-16 21:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册