這里面小小總結一下java web實現excel報表模版的下載。
貼核心代碼如下:
public String download() throws Exception { //request,respose對象同樣可以通過其它方式獲取,Catalog是自定義的一個類 HttpServletRequest request = Catalog.getRequest(); HttpServletResponse response = Catalog.getResponse(); final String comp_id = (String)request.getSession().getAttribute( Constant.COMP_ID); HSSFWorkbook workbook = new HSSFWorkbook(); loadStyle(workbook); HSSFSheet JobSheet = workbook.createSheet("jobDetials"); produceJobSheet(workbook,JobSheet); String filename=comp_id+"_"+"dynamictable_report.xls"; //執行文件輸出 runExcelFileExport(response,workbook,filename); return ""; } //------------------------------------------------------------------------------------------------------------------------------ private void produceJobSheet(HSSFWorkbook workbook,HSSFSheet sheet) throws Exception { HSSFRow row = sheet.createRow(0); //Create the hard columns of header HSSFCell cell_emp = row.createCell(0); cell_emp.setCellStyle(arial_bold_style); cell_emp.setCellValue("EmployeeId"); sheet.setColumnWidth(0, 6000); HSSFCell cell_name = row.createCell(1); cell_name.setCellStyle(arial_bold_style); cell_name.setCellValue("EmployeeName"); sheet.setColumnWidth(1, 6000); HSSFCell cell_gradeId = row.createCell(2); cell_gradeId.setCellStyle(arial_bold_style); cell_gradeId.setCellValue("GlobleEEID"); sheet.setColumnWidth(2, 6000); } } //-------------------------------------------------------------------------------------------------------------------------- private static void runExcelFileExport(HttpServletResponse response, HSSFWorkbook wb, String filename) { try { ServletOutputStream sos = response.getOutputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); wb.write(buffer); response.setContentType("application/vnd.ms-excel"); response.setContentLength(buffer.size()); response.setHeader("Content-Disposition", "attachment; filename=" + filename); response.setHeader("Pragma", "public"); response.setHeader("Cache-Control", "max-age=0"); sos.write(buffer.toByteArray()); buffer.flush(); sos.flush(); } catch (IOException e){ e.printStackTrace(); } }
ok,到這個位置后台的三個主要的方法就完成了。
如果要實現web頁面的功能,當然需要一個jsp頁面,一個按鈕,按鈕點擊調用后台download方法。所以把這三個方法放在一個action,或者controller里面,或者直接是一個servlet就都可以實現了。 ps:
1. 通過HttpResponse定義的方法getOutputStream()可以獲得ServletOutputStream的實例, 這樣用戶就可以利用ServletOutputStream.write方法向輸出流中寫入返回頁面的內容. 或者寫入下載文件的內容。
2.那么為什么會以下載文件的形式出現呢?
response.setHeader("Content-Disposition", "attachment; filename="+ filename);核心是這里面的attchment。要確保這個參數的值,才能web頁面點擊按鈕過后,向輸出流中寫入的內容會下載文件的方式出現。