jxl 、 apache.poi.hssf 實現本地, 服務器斷的下載

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";

}

相關文章
相關標籤/搜索