<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
以上是我使用的poi依赖版本
1. 首先写个导出Excel工具类
(为了简单快捷,有点简陋,列宽未设置,格式未设置,例如日期格式)
参考地址:使用Java导出Excel表格并由浏览器直接下载 - it610.com 在参考地址原代码中做了两处Bug修改
package com.epson.esl.rms.excel;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.List;
public class ExcelUtil {
/**
* 生成Excel表格
*
* @param sheetName sheet名称
* @param titleList 表头列表
* @param dataList 数据列表
* @return HSSFWorkbook对象
*/
public static HSSFWorkbook createExcel(String sheetName, List<String> titleList, List dataList,
HttpServletResponse response, String fileName) {
// 创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
// 创建sheet对象
try {
HSSFSheet sheet = wb.createSheet(sheetName);
// 在sheet里创建第一行,这里即是表头
HSSFRow rowTitle = sheet.createRow(0);
// 写入表头的每一个列
for (int i = 0; i < titleList.size(); i++) {
// 创建单元格
rowTitle.createCell(i).setCellValue(titleList.get(i));
sheet.setColumnWidth(i, 30 * 256); //在cell层次设置列宽
rowTitle.getCell(i).getCellStyle().setWrapText(true); //设置自动换行,否则内容含有\n也必须鼠标双击才能手动换行
}
// 写入每一行的记录
for (int i = 0; i < dataList.size(); i++) {
// 创建新的一行,递增
HSSFRow rowData = sheet.createRow(i + 1);
rowData.setHeight((short) (2 * 512));//在cell层次设置行高
// 通过反射,获取POJO对象
Class cl = dataList.get(i).getClass();
// 获取类的所有字段
Field[] fields = cl.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
fields[j].setAccessible(true);//反射时可以操作私有成员属性的值,如果不设置只能获取public类型属性还有可能抛禁止访问异常
// 创建单元格
rowData.createCell(j).setCellValue(
null == fields[j].get(dataList.get(i)) ? "" : fields[j].get(dataList.get(i)).toString());
}
}
// 输出Excel文件
OutputStream output = response.getOutputStream();
response.reset();
// 中文名称要进行编码处理
response.setHeader("Content-disposition",
"attachment; filename=" + new String(fileName.getBytes("GB2312"), "ISO8859-1") + ".xls");
response.setContentType("application/msexcel");
wb.write(output);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return wb;
}
}
2 . 编写Controller的API
/* 导出记录到Excel并且下载 */
@RequestMapping("exportExcel")
public void exportExcel(@RequestParam(value = "dn") String dn, @RequestParam(value = "itemCode") String itemCode,
@RequestParam(value = "scanDateTimeStart") String scanDateTimeStart, @RequestParam(value = "scanDateTimeEnd") String scanDateTimeEnd
,HttpServletRequest request, HttpServletResponse response) {
//4参数是页面查询的条件
try {
//文件名
String fileName = "历史记录";
//sheet名
String sheetName = "记录";
//表头集合,作为表头参数
List<String> titleList = new ArrayList<>();
titleList.add("编号");
titleList.add("数量");
titleList.add("时间");
titleList.add("用户");
titleList.add("异常原因");
//数据对象,从数据库中得到
List<Task> tasks = taskService.searchRecord(dn, itemCode, scanDateTimeStart, scanDateTimeEnd);
//调取导出Excel工具类中封装的方法,传入相应的参数
ExcelUtil.createExcel(sheetName,titleList, tasks,response,fileName);
// request.setAttribute("msg", "导出成功");
}catch(Exception ex){
ex.printStackTrace();
//request.setAttribute("msg", "导出失败");
}
}
页面貌似只能使用submit 、从定向,无法使用ajax下载文件,以下是原ajax请求修改成重定向至导出数据Url
window.location.href = "/exportExcel?dn="+dn+"&itemCode="+itemCode+"&scanDateTimeStart="+scanDateTimeStart+"&scanDateTimeEnd="+scanDateTimeEnd;