背景:在报表功能模块中经常可能涉及到需要对查询到的数据导出到excel文件中,对于excel的导入导出功能easypoi具有使用集成简单,使用方便的特点,这里就记录一下项目中使用easypoi导出excel文件的一次全过程
关于easypoi的具体使用可参考教程:easyPoi教程
直接上代码,首先pom文件
cn.afterturn
easypoi-base
3.0.1
cn.afterturn
easypoi-web
3.0.1
cn.afterturn
easypoi-annotation
3.0.1
由于我们的目的是下载文件,所以不能发送ajax请求,如果是ajax来发送请求的话会返回一堆乱码,一般如果需要下载文件的话同城情况下会采用下面两种方式
点击下载Excel
or
location.href = '/downUrl';
但是我并没采用这种方式,因为,我要根据搜索条件到后台查询数据库,拿到对应的数据再写入到excel再下载,上面两种方式虽然也可以传递参数,但传递的参数有限,所以我这里采用的是改造后的post请求方式,请求下载,代码如下:
//自定义post请求下载文件
function DownLoad(options) {
var config = $.extend(true, { method: 'post' }, options);
var $iframe = $('
package cn.xgq.web.util;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
/**
* @Auther: HeJD
* @Date: 2018/10/9 13:54
* @Description:
*/
public class EasyPoiUtil {
/**
* 功能描述:复杂导出Excel,包括文件名以及表名。创建表头
*
* @author HeJD
* @date 2018/10/9 13:54
* @param list 导出的实体类
* @param title 表头名称
* @param sheetName sheet表名
* @param pojoClass 映射的实体类
* @param isCreateHeader 是否创建表头
* @param fileName
* @param response
* @return
*/
public static void exportExcel(List> list, String title, String sheetName, Class> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
ExportParams exportParams = new ExportParams(title, sheetName);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(list, pojoClass, fileName, response, exportParams);
}
/**
* 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头
*
* @author HeJD
* @date 2018/10/9 13:54
* @param list 导出的实体类
* @param title 表头名称
* @param sheetName sheet表名
* @param pojoClass 映射的实体类
* @param fileName
* @param response
* @return
*/
public static void exportExcel(List> list, String title, String sheetName, Class> pojoClass, String fileName, HttpServletResponse response) {
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
}
/**
* 功能描述:Map 集合导出
*
* @author HeJD
* @date 2018/10/9 13:54
* @param list 实体集合
* @param fileName 导出的文件名称
* @param response
* @return
*/
public static void exportExcel(List
@Controller
@RequestMapping("/bordereaux_order/")
public class BordereauxOrderController {
@Autowired
private WebOrderMapper webOrderMapper;
@RequestMapping("export_excel")
public void exportExcel(@RequestParam Map map, HttpServletResponse response){
//根据条件查询数据库数据list
List list = webOrderMapper.searchCustomerOrderByMap(map);
//设置表名,引脚名,文件格式,及写入list数据到excel中
EasyPoiUtil.exportExcel(list,"客户订单统计表","客户订单统计",BordereauxOrderStatisticalVo.class,"客户订单统计表.xls",response);
}
}
这里我们需要简单的对实体类进行设置,设置实体类BordereauxOrderStatisticalVo字段对应excel列名及表格宽高,我们通过注解方式,关于注解的使用可参考上面的教程。
@Data
public class BordereauxOrderStatisticalVo {
@ExcelIgnore
private String vcCustomerId;
@Excel(name = "客户名称",height = 11, width = 15)
private String vcName;
@Excel(name = "客户手机号",height = 11, width = 15)
private String vcPphone;
@Excel(name = "客户电话",height = 11, width = 15)
private String vcTel;
@Excel(name = "业务员",height = 11, width = 15)
private String vcSalesman;
@Excel(name = "是否未提交",replace = {"是_0", "否_1","否_2","否_3","否_4","否_5"}, height = 11, width = 15)
private Integer orderStatus;
/**
* @Description: 客户订单统计
*/
@Excel(name = "客户订单总计",height = 11, width = 15)
private Integer orderTotal;
/**
* @Description: 客户订单金额统计
*/
@Excel(name = "客户订单总金额",height = 11, width = 15)
private Double orderMoneyTotal;
}
当我们发送请求到后台时,首先会查询数据库,然后将查询到数据写入到excel中,然后前台页面提示下载