jxl 實現下載: package com.inspur; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import jxl.write.biff.RowsExceededException; /* jxl 實現下載 */ /** *@author WHD *2014-11-15 */ public class JxlOut { public static void main(String[]args) throws IOException, RowsExceededException, WriteException{ File file= new File("I:/TESTfxl.xls"); //若是不是從服務器下載到本地則輸出流不用File方式而使用resonance.getOutPutStream()方式獲取輸出流就ok了 //使用 OutputStream output=response.getOutputStream()來代替, //FileOutPutStream這樣咱們就不用提早來寫路徑,也就是能夠直接下載到客戶端選擇的路徑下 FileOutputStream output= new FileOutputStream(file); WritableWorkbook wwb = Workbook.createWorkbook(output);//建立工做簿 WritableSheet ws = wwb.createSheet("Sheet1", 0);//建立工做sheet頁 // 將具體數據添加到具體頁面,而這裏的賦值可使用循環將數據庫中 //取出的數據 全都添加到sheet中 若是數據多的話還可使用多個sheet // sheet 就是 excel中的一頁 Label labelC = new Label(0, 0, "jxltest"); ws.addCell(labelC); // 寫出到指定的流中 wwb.write(); // 關閉物理資源 wwb.close(); output.flush(); output.close(); } }
/* apache.poi.hssf HSSFWorkBook 實現下載 */ /** * excel 模板下載 實際項目中使用到的下載 */ @RequestMapping(value = "downExcelTemplate") public void downExcelTemplate(HttpServletResponse response) { // 獲取元數據id 在獲取數據個數造成excel 模板 String meta_id = this.getPara("meta_id"); // 獲取對應數據源對應的表的字段屬性 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); // 這裏獲取的也就是item_def中 def_id=meta_id的name_cn,造成excel模板 list = datamanagerService.findItemById(meta_id); // Map<String,Object> datas=new HashMap<String,Object>(); int i = 0; // 將list中的值進行導出 try { // 建立一個Excel文件 HSSFWorkbook workbook = new HSSFWorkbook(); // 建立一頁 HSSFSheet sheet = workbook.createSheet(); // 建立一行 HSSFRow row = sheet.createRow(0); // 建立一列 HSSFCell cell = null; // 遍歷向excel中賦值 for (Map<String, Object> data : list) { cell = row.createCell(i); cell.setCellValue((String) data.get("name_cn")); ++i; } // 生成excel // 在從服務器的目錄下進行下載 // 下載文件名 String fileName = "ExcelTemplate.xls"; response.reset(); response.setContentType("application/x-download"); response.addHeader("Content-Disposition", "attachment;filename=" + fileName); // 這樣寫在下載的時候會讓你選擇路勁,而若是使用 // OutputStream os= new FileOutputStream("G:"+File.separator+"test.java"); // 來代替os則就是本地下載 OutputStream os = response.getOutputStream(); workbook.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } }
上面的兩個都是將數據庫中的數據組裝成excel 的格式,並進行下載,怎麼讓他下載,或者說用何種方式來請求下載資源,方式有以下兩種。java
一、使用ajax異步請求將數據使用 response 的OutputStream來將數據輸出到本地。ajax
二、使用同步方式,有兩種一種是使用form的button 來提交請求參數,另外一種是使用window.location.href="Test?name=123&password=6789";這種方式來請求,兩種方式均可以。數據庫
注意: 這裏說一下使用「2」 中的同步方式是不會刷新現有頁面的,由於他沒有向該頁面返回數據而是下載到了本地磁盤,因此現有頁面不會被刷新。apache
上面咱們看了兩大種方式來實現,其實ajax方式是不能實現的,那是由於response緣由,通常請求瀏覽器是會處理服務器輸出的 response,例如生成png,文件下載等,ajax請求只是個「字符性」的請求,能夠讀取到返回的response,但只是讀取而已,是沒法執行的,說白點就是js沒法調用到瀏覽器的下載處理機制和程序瀏覽器
這樣看來只有第二種方式能直接實現下載了,可是第二種方式中使用哪種那,建議使用form 的submit提交方式來實現,這樣的話咱們提交的參數是安全的而使用window.location.href="test?name=name&password=123" 這樣的話參數直接暴露了因此建議使用form 的submit() 方式來實現。安全
下面來看看"2" 中的兩種方式,寫個小demo 以下:服務器
一、form的submit() 方式實現:app
function _excel(){異步
var mfrm=document.frm;this
mfrm.action="Test";
mfrm.submit();
return true;
};
二、使用window.location.href=""方式實現:
function excel_(){
window.location.href="Test?name=123&password=6789";
}