我这个是写在JSP中的。用Servlet,Action神马的都不错。
首先建立一个JSP: ExportExcel.jsp.
<%@page import="java.net.URLEncoder"%>
<%@page import="org.qdga.xtkh.model.QueryTemp"%>
<%
//杜宏浩
//2012-3-7
//导出Excel
//获得参数list 以便于后面遍历
List<QueryTemp> list=(List<QueryTemp>)request.getAttribute("queryList");
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"+list.size());
//产生随机数 防止文件名称冲突
Calendar cld = Calendar.getInstance();
Date date = new Date();
cld.setTime(date);
int year = cld.get(Calendar.YEAR);
int month = cld.get(Calendar.MONTH) + 1;
int day = cld.get(Calendar.DAY_OF_MONTH);
int hour = cld.get(Calendar.HOUR_OF_DAY);
int min = cld.get(Calendar.MINUTE);
int second = cld.get(Calendar.SECOND);
int rand = (int) ((Math.random() * 10000));
StringBuffer sb = new StringBuffer();
sb.append(year);
sb.append(month);
sb.append(day);
sb.append(hour);
sb.append(min);
sb.append(second);
sb.append(rand);
sb.append(".xls");
String fillPath = sb.toString();
try {
// 打开文件
WritableWorkbook book = Workbook.createWorkbook(new File(
fillPath));
// 生成名为“第一页”的工作表,参数0表示这是第一页
WritableSheet sheet = book.createSheet(" 第一页 ", 0);
// 合并第一列第一行到第六列第一行的所有单元格
sheet.mergeCells(0, 0, 3, 0);
//字串格式化
WritableFont font1 = new WritableFont(WritableFont.TIMES, 16,
WritableFont.BOLD);
WritableCellFormat format1 = new WritableCellFormat(font1);
format1.setAlignment(jxl.format.Alignment.CENTRE);
// 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
// 以及单元格内容为test
Label label = new Label(0, 0, " 巡检提报统计 ", format1);
// 将定义好的单元格添加到工作表中
sheet.addCell(label);
sheet.addCell(new Label(1, 1, "部门名称"));
sheet.addCell(new Label(3, 1, "数量"));
//遍历添加list到excel单元格中。
for(int i=0;i<list.size();i++)
{
sheet.addCell(new Label(1, i+2, list.get(i).getDeptName()));
sheet.addCell(new Label(3, i+2,String.valueOf( list.get(i).getNum())));
}
sheet.addCell(new Label(1, 8, "注:列表中未出现的部门,说明该部门的此类信息数量为0."));
// jxl.write.Number number = new jxl.write.Number(0, 1, 555.12541);
// sheet.addCell(number);
// 写入数据并关闭文件
book.write();
book.close();
} catch (Exception e) {
System.out.println(e);
}
//获得Tomcat的工作目录 --->bin
String userDir = System.getProperty("user.dir");
File file = new File(userDir + "/" + fillPath);
InputStream fis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.setCharacterEncoding("UTF-8");
String fileName = URLEncoder.encode(file.getName(), "UTF-8");
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(fileName.getBytes()));
response.addHeader("Content-Length", "" + file.length());
response.setContentType("application/ms-excel");
OutputStream os = response.getOutputStream();
os.write(buffer);
os.flush();
os.close();
//重写out 清除OutputStream冲突异常
out.clear();
out = pageContext.pushBody();
%>
需要注意的是,jxl导出Excel默认路径为Tomcat下的bin目录。原因以及是否能改变路径,我都不得而知。
于是用System.getProperty("user.dir");拿到bin目录下的权限。通过文件流传递到前端提供下载。
Copyright 杜宏浩。 http://www.ytcbo.com
//增加功能---------
//文件下载完毕后删除 节约资源
File file2 = new File(fillPath);
if (file2.isFile() && file2.exists()) {
file2.delete();
}
使用jxl实现导出Excel,解决路径和删除文件的问题
最新推荐文章于 2021-02-17 05:25:24 发布