1. 程式人生 > >在做excel導出時如何將workbook直接寫在輸出流中

在做excel導出時如何將workbook直接寫在輸出流中

... tails 但是 ica 組件 cep exceptio sys 容易

參考網址

https://blog.csdn.net/u011109420/article/details/51330677

https://blog.csdn.net/u012116457/article/details/49780677

Java 後臺 Excel 文件生成後轉化為字節流

java excel 使用 poi組件, HSSFWorkbook workBook = new HSSFWorkbook(); 
對於workBook生成字節流,很容易發現有個workBook .getBytes(),但是,是不可用的,下載以後打不開,
如果下載,正確的寫法為
workBook.write(response.getOutputStream());
如果轉化為字節流:
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
workBook.write(os);
ByteArray bytes = os.toByteArray();
 String fileName = "xxx.xls";

               response.reset();
                response.setContentType("application/msexcel;charset=utf-8");
                response.setHeader("Content-disposition", "attachment;filename= "+ fileName); 
               response.getOutputStream().write(bytes.getRawBytes());
               response.getOutputStream().flush();
               response.getOutputStream().close();
           } catch (IOException e) {
               // TODO Auto-generated catch block
            e.printStackTrace();
          }       上代碼經過驗證可行。


dwr的寫法
:ByteArrayOutputStream os = new ByteArrayOutputStream();
  try
  {
   hssfWorkbook.write(os);
   return new FileTransfer(new String("XXXX.xls".getBytes(),"iso8859-1"),  "application/ms-excel", os.toByteArray());
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }

這裏,我們使用了ByteArrayOutputStream和ByteArrayInputStream類...處理的思想是,將HSSFWorkbook 寫入ByteArrayOutputStream.
然後用ByteArrayOutputStream來轉換為字節流..然後再將字節流轉換為ByteArrayInputStream ..至此,我們就在內存中將excel轉換成了輸入流.. 代碼如下 ByteArrayOutputStream os = new ByteArrayOutputStream(); try { wb.write(os); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } byte[] b = os.toByteArray(); ByteArrayInputStream in = new ByteArrayInputStream(b); 全部的代碼太多,不貼上來了..相信大家都願意用這個辦法..因為使用之前說的那個產生隨機文件名的辦法.要繁瑣的多... 總結 首先,我們必須明確我們所要實現的功能.我們在之前已經使用SHHF完成了excel的生成,現在的工作是將這個excel轉換成輸入流提供給struts2以實現下載...也就是說我們是要轉換成輸入流.... 明確了目標以後,我們將開始設計...我們的思路是,先創建一個輸出流,將這個excel寫入到輸出流裏面,然後再通過這個輸出流來得到我們所需要的輸入流...這裏我們嘗試了兩張辦法.第一種,就是使用臨時文件的辦法.我們創建的輸出流先將內容寫入到臨時文件裏面,然後我們從臨時文件裏讀取輸入流.這個辦法我們用到的是FileOutputStream 和FileInputStream. 但是臨時文件的問題讓程序變得異常復雜,所以我們的目標改成在內存中完成對excel到輸入流的轉換.所以我們用到了ByteArrayInputStream 和ByteArrayOutputStream .其實就是這麽簡單.. 最後附上從Excel模板獲得需要導出的EXCEL文件的輸入流方法。 Java代碼 public InputStream getExcelISForAs(List<Object> list) throws Exception { InputStream excelStream = null; FileInputStream fis = new FileInputStream(templatePath + "/template.xls"); HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis)); fis.close(); generateExcelForAs(list, wb);//填充EXCEL內容方法 ByteArrayOutputStream out = new ByteArrayOutputStream(); HSSFWorkbook hssWb = (HSSFWorkbook) wb; hssWb.write(out); excelStream = new ByteArrayInputStream(out.toByteArray()); out.close(); return excelStream; }

  

在做excel導出時如何將workbook直接寫在輸出流中