问题描述:现用代码生成了个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文档对象
请高手们多多指教呀,小弟在此先谢谢了!
从数据库中已查出InputStream类型,所以直接可得到Excel文档对象,根据
WritableWorkbook workbook = null; InputStream is //如果is为查询出来的流 workbook = Workbook.getWorkbook(is)
问题已自己解决
楼主看一下NPOI吧,可以直接加载数据流为Excel文档。
谢谢推荐!