在很多项目中,都会有“数据导出到Excel”的需求,导出其实满简单的,但以前还没接触过导出功能时,项目需求就有一个导出功能,查看了网络中各人的经验。发现都很乱。讲不清楚。看不明白。要的没有,不要的一大堆加在代码中,使得新手看到这些代码很混乱。今天我也记录一下我导出Excel的方法。我会按步骤去写。这样大家可以直接Copy代码,然后根据自己的需求修改相应的步骤里的方法即可。
最近赶项目中,今天周六周日可以休息了,上周可是连续加班。在休息期间写写博客。谢谢大家的关注。
*导出Excel步骤
- 先导包,(poi包,他是apache下的导出Excel封装类包)
- 写导出Excel功能类
- 在Action中调用第二步的Excel功能类
- 在JSP前台调用Action执行导出功能
1.先导包,(poi包,他是apache下的导出Excel封装类包)
POI包,大家可以上百度下载。这个容易,我就不描述了。下载后,把包导入到你的项目中即可
2.写导出Excel功能类
这一步很关键。是导出的重要步骤,也是你要修改最多的内容,直接贴代码了。对了,对下面不能理解的同学,可以先自己在电脑上建一个Excel文档,先了解一下他是什么结构的表格。这样会更容易理解下面的代码。下面代码是一行行的插入数据,第一行为标题,第二行以后就是标题对应的数据,也就是数据库的数据了。
<pre name="code" class="java">public class V_WEB_ZPLX_Excel {
Workbook wb = new HSSFWorkbook();
@SuppressWarnings("unchecked")
public void printExcel(List<V_WEB_ZPLX> list, OutputStream os)
throws IOException {
try {
Sheet sheet = wb.createSheet("Excek表的名字");
String[] title = { "日期", "内容<span style="font-family: Arial, Helvetica, sans-serif;">", "</span><span style="font-family: Arial, Helvetica, sans-serif;">内容1</span><span style="font-family: Arial, Helvetica, sans-serif;">", "内容2", "其他", "总计" };</span>
Row titleRow = sheet.createRow(0);
for (int i = 0; i < title.length; i++) {
Cell cell = titleRow.createCell(i);
cell.setCellValue(title[i]);
sheet.setColumnWidth(i, 3000);
}
Cell cell = null;
int getDqyhcwlzp = 0, dxzp = 0, qt = 0, wlzp = 0, zj = 0;
List sunNum = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Row row = sheet.createRow(i + 1);
V_WEB_ZPLX v_web_zplx = list.get(i);
String[] contents = { v_web_zplx.getSumDate(),
String.valueOf(v_web_zplx.getDxzp()),
String.valueOf(v_web_zplx.getWlzp()),
String.valueOf(v_web_zplx.getDqyhcwlzp()),
String.valueOf(v_web_zplx.getQt()),
String.valueOf(v_web_zplx.getZj()) };
for (int j = 0; j < contents.length; j++) {
cell = row.createCell(j);
cell.setCellValue(contents[j]);
}
getDqyhcwlzp += list.get(i).getDqyhcwlzp();
dxzp += list.get(i).getDxzp();
qt += list.get(i).getQt();
wlzp += list.get(i).getWlzp();
zj += list.get(i).getZj();
if (i == (list.size() - 1)) {
sunNum.add(getDqyhcwlzp);
sunNum.add(dxzp);
sunNum.add(qt);
sunNum.add(wlzp);
sunNum.add(zj);
row = sheet.createRow(i + 2);
cell = row.createCell(0);
cell.setCellValue("总计:");
for (int n = 0; n < sunNum.size(); n++) {
cell = row.createCell(n + 1);
cell.setCellValue(String.valueOf(sunNum.get(n)));
}
}
;
}
wb.write(os);
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
os.close();
}
}
}
3.在Action中调用第二步的Excel功能类
//导出
@Action("ZPLXExcel")
public String ZPLXExcel() throws IOException{
Object [] params = (Object[]) getSession().getAttribute("params");
Object [] values = (Object[]) getSession().getAttribute("values");
List<V_WEB_ZPLX> list = v_web_zpjqb_service.find(params, values, -1, -1);
OutputStream os= response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
this.ExcelNmae("诈骗类型");
<V_WEB_ZPLX_Excel v_web_zplx_excel = new V_WEB_ZPLX_Excel();
v_web_zplx_excel.printExcel(list, os);
System.setOut(new PrintStream(os));
os.flush();
return null;
}
我这里思路是:我调用了我项目中的按条件查询并带有分页功能的方法。把里面的条件(params)和前台传过来的值(values)用Session传过来,既然要传过来,自然要在那个方法里先把这两个参数放到Session中,才能使用上面Session方法读出。然后我们再调用find()查询出List数据集合。最后就是下面的导出Excel语句了,把list传入即可。
不会Session保存?那我再贴出把值放入Session中的语句吧。
ServletActionContext.getRequest().getSession().setAttribute("params", params);
ServletActionContext.getRequest().getSession().setAttribute("values", values);
OK.就是这样了。最后我们在前台JSP中调用这个方法即可。如下
4.在JSP前台调用Action执行导出功能
location.href = "${pageContext.request.contextPath}/<span style="font-family: Arial, Helvetica, sans-serif;">ZPLXExcel</span><span style="font-family: Arial, Helvetica, sans-serif;">.action";</span>