一个需求,用户点击下载按钮,将指定的excel的报表模板使用数据库数据渲染,然后下载到用户本地;
通常而言,对于一个文件的下载,可以有以下几种方式:
window.location.href=文件名称URL全路径;
window.open(文件名称URL全路径);
这种方式不友好的地方在于服务器的目录结构直接暴露出去,而且在IE下很有可能会报错权限问题等,甚至firefox中会触发那个年代久远而依然没有解决的bug。所以这里不推荐。
对于jxl生成excel文件,有两种方式,一种是生成文件保存到磁盘,另一种是直接保存到输出流中。
对于上述需求,如果生成的文件保存到磁盘,随着系统运行,磁盘会逐渐被占用,需要手动去删除。由于文件都较小,所以这里采用第二种方式,直接在内存中生成文件,然后提供给用户下载的时候response回去。
看一个例子:
用于响应下载请求的controller
/**
* 下载个人订单
* @param request
* @param response
* @param modelMap
*/
@RequestMapping(value="/download.do", method=RequestMethod.GET)
public void processDownload(HttpServletRequest request,HttpServletResponse response
, ModelMap modelMap) {
long userId = getUserId(request);
String ids = request.getParameter("ids");
try {
Long[] idarray = getIdsFromStringArray(ids.split(","));
if (null == idarray || 0 == idarray.length) {
return;
}
// 直接往response的输出流中写excel
OutputStream outputStream = response.getOutputStream();
// 获取文件名称
String fileName = getUserFileName(userId);
// 下载格式设置
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=/"" + fileName + "/"");
// 读取数据渲染模板并写入outputstream中
List<PhAdvertiseOrderDO> advertiseOrderList = phAdvertiseOrderService.getAdvertiseOrderByIds(idarray, userId);
outputStream = excelFileService.generalExcelFileInOutputStream(outputStream, advertiseOrderList);
outputStream.close();
} catch (Exception e) {
logger.error("下载报表发生异常!", e);
}
}
其中调用到的文件服务
/* (non-Javadoc)
* @see com.netease.photography.service.ExcelFileService#generalExcelFileInOutputStream(java.lang.String, java.io.OutputStream, java.util.List)
*/
public OutputStream generalExcelFileInOutputStream(OutputStream outputStream, List<PhAdvertiseOrderDO> advertiseOrderList) throws BiffException, IOException, WriteException {
// 检查参数是否合法
checkParam(tempalteFile,"no File",advertiseOrderList);
// 获取模板
Workbook templatebook = Workbook.getWorkbook(new File(tempalteFile));
WritableWorkbook writeableWorkbook = Workbook.createWorkbook(outputStream, templatebook);
// 读取数据写入模板
readDataAndWriteTemplate(templatebook, writeableWorkbook, advertiseOrderList);
return outputStream;
}
其中的重点就在于
WritableWorkbook writeableWorkbook = Workbook.createWorkbook(outputStream, templatebook);
这句话指定了写入的数据到输出流中。
页面调用很简单
function getOrderFileNoDirect() {
var ids ="";
for(var i=0;i<30;i++){
if($("choose"+i) != null && $("choose"+i).checked == true) {
ids += $("choose"+i).value;
ids += ",";
}
}
if(ids==""){
alert('不能建立空报表!');
return;
}
window.open("download.do?ids="+ids);
}
分享到:
相关推荐
java利用jxl生成excel文件,代码直接导入就可以跑(修改自己的生成的ecxel地址)
利用jxl包结合java反射机制和注释,直接把list生成对应的Excel文件,即只需传入list、对应生成的对象、标题就可以生成excel文件write(String title, List list,Class c),实现一个简单生成excel工具类
利用jxl操作excel文件,提取exce文件数据生成txt文件。
自己封装的方法,调用 XlHelper.getXl(List<?> voList , Object head , OutputStream ops)方法,直接返回需要的excel,而不需要再去写jxl的方法。第一个参数voList 是excel里的内容,第二个参数head是excel表头。第...
java用于生成EXCEL等文件格式的包,直接导入到java工程即可,简单方便,另外还配有jxl api说明文档
poi jxl 生成EXCEL 报表 POI 用的JAR poi-3.6-20091214.jar jxl 用到的jar jxl-2.6.jar
java 通过JXL架包,给excel文件添加水印,水印内容可自定义
Java生成excel jxl 代码Java生成excel jxl 代码
在java开发中,通过jxl.jar提供的api可以方便的生成你想要的excel文件。
java通过jxl生成excel实例,读取excel,复制,修改excel文件
poi包括三种常用jar包,各自支持的格式在文件名里表示出来了。jxl相对操作容易但是功能简单,poi操作复杂但是功能更强大,具体用哪个看自己吧。另外poi还支持对PPT,WORD等文件的支持。。
java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图
jxl是对excel强有力的操纵工具,它具有丰富的API可以满足对excel的各种开发需要。
用jxl生成EXCEL表格,一个非常简单易懂的写法。
本例优点运行main方法即可到指定路径看到效果。 jxl创建Excel例子,包含创建合并单元格、设置列/单元格属性(字体、宽、高、边框、背景色、自动换行、水平 垂直对齐方式等)。
java向EXCEL中写入数据。里面有一个ExcelWrite.java的文件和一个jxl的jar包。
NULL 博文链接:https://heisetoufa.iteye.com/blog/1932093
例子如下: Object是一个对象实体类,如Studnet.java. List 是一个对象集合,后面的是输出路径. WriteExcel rw=new WriteExcel(); rw.writeExcel(new Object(), List, "f:/a.xls","库存表");
使用JAVA通过JXL(JExcel)动态生成Excel文件
Java_Excel_API_jxl入门及jxl.jar下载(java生成excel文件)