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