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

}

相关文章
相关标签/搜索