參考網址
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;
}
