实现思路:
1、前端展示列表数据
2、js中通过获取勾选数据的id,构建一个空的form表单,并将id通过input绑定到form表单中,提交表单,发送请求
3、后台处理根据id查询数据,并将数据填充到Excel表格,并将填充完整的数据发送到前端
一,前端:
(1)前端js下载方法,点击事件可调用此方法,param作为一个字符串数组参数,将多个选择的id存放到集合中。以逗号分割。
/** * 下载文件 */ function download(param){ // 构造空的from表单,并创建input输入框,将参数传到后台 var form = $("<form></form>"); var tempInput = "<input type = 'hidden' id = 'param' name = 'param' value = '"+param+"' />"; form.append(tempInput); form.attr("action",url); form.attr("method","post"); $(document.body).append(form);// chrome56版本以后修复form提交的bug }
二、后端:里面通过类调用的方法,具体不提供类。只提供方法,调用方法的类自行创建
(1)接收,并处里字符串:
/** * @param request * @param response * @param fundCode * @param depositCode * @param bornDate * @throws Exception * @author lxs * @Date 2018年5月29日10:42:59 */ @RequestMapping("/exportDataHS") @ResponseBody public void exportDataHS(HttpServletRequest request, HttpServletResponse response, String param throws Exception{ // 设置查询参数 Map<String,Object> paramMap = new HashMap<String,Object>(); paramMap.put("param", param.split(",")); // 根据参数获取数据 List<InterbankDeposit> interbankDepositList = interbankDepositService.queryInterbankDepositDetail(paramMap); String excelFileName ="ASSET_" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "_01.xlsx"; // 处理需要导出的数据 SXSSFWorkbook wb = interbankDepositService.setExportExcel(interbankDepositList); // 写出Excel到前端, ExcelUtils.outWriterExcel(request, response, wb, excelFileName); }
(2)setExportExcel方法
/** * @param interbankDepositList * @return * @author lxs * @throws Exception * @Date 2018年5月29日10:42:59 */ public SXSSFWorkbook setExportExcel( List<InterbankDeposit> interbankDepositList) throws Exception { return ExcelUtils.initExcelx(listToArray(interbankDepositList), getHeaders(), "sheet1"); }
(3)outWriterExcel方法:
/** * 写出excel Workbook 支持2003 且 xlsx 高版本 * @param request * @param response * @param wb 工作簿对象 * @param name 文件名称 * @throws IOException */ public static void outWriterExcel(HttpServletRequest request,HttpServletResponse response,Workbook wb ,String name) throws IOException{ if (null == wb) { return; } request.setCharacterEncoding("UTF-8"); String userAgent = request.getHeader("User-Agent"); byte[] bytes = userAgent.contains("MSIE") ? name.getBytes() : name.getBytes("UTF-8"); // name.getBytes("UTF-8")处理safari的乱码问题 name = new String(bytes, "ISO-8859-1"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/x-download"); response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", name)); OutputStream out = response.getOutputStream(); if (null == out) { return; } wb.write(out); out.flush(); out.close(); }
(4)getHeaders()设置表头方法:
/** * 设置Excel表头 * @return * @author lxs * @Date 2018年5月29日10:54:35 */ private List<HeaderEntity> getHeaders() { List<HeaderEntity> headers = new ArrayList<HeaderEntity>(); headers.add(HeaderUtil.getHeader("名称", "width", 8000)); headers.add(HeaderUtil.getHeader("单位", "width", 3300)); headers.add(HeaderUtil.getHeader("性别", "width", 4500)); headers.add(HeaderUtil.getHeader("年龄", "width", 2800)); return headers; }(5) listToArray将数据转换为数组方法:
/**
* 将集合数据转换为数组
* @param interbankDepositList
* @return
*/
private List<Object[]> listToArray(
List<InterbankDeposit> interbankDepositList) {
List<Object[]> list = new ArrayList<>();
for (InterbankDeposit interbankDeposit : interbankDepositList) {
List<Object> listObj = new ArrayList<>();
listObj.add(interbankDeposit.getMoney());
listObj.add(formatterExcelExport(interbankDeposit.getBornDate()));
listObj.add(formatterExcelExport(interbankDeposit.getLastPayDate()));
listObj.add(interbankDeposit.getFundCode());
list.add(listObj.toArray());
}
return list;
}
(6)formatterExcelExport(Object value)将数据格式化输出到表格的方法:其他格式化自行添加
/** * 导出数据格式转换 * @param value * @Date 2018年5月29日11:10:29 */ public String formatterExcelExport(Object value){ Date result = (Date) value; String res = new SimpleDateFormat("yyyyMMdd").format(result); return res; }
(7)导出的Excel公用表头实体类
/** * * @Description: 导出公用表头 实体类 * */ public class HeaderEntity { /** * 表头名称 */ private String headerTitle; /** * 定义宽度 */ private int headerWidth = 2400; /** * 是否需要进行格式化时 * 1、 数字格式化 * 2、 时间格式化(yyyy/MM/dd) * 3、时间格式化(yyyyMMdd) * 6、当字段为null或者null时,返回值为"" */ private int headerFormat = 0; /** * 值为0 时默认样式,否则为其他样式 (目前只有两个样式) */ private int headerStyle = 0; public String getHeaderTitle() { return headerTitle; } public void setHeaderTitle(String headerTitle) { this.headerTitle = headerTitle; } public int getHeaderWidth() { return headerWidth; } public void setHeaderWidth(int headerWidth) { this.headerWidth = headerWidth; } public int getHeaderFormat() { return headerFormat; } public void setHeaderFormat(int headerFormat) { this.headerFormat = headerFormat; } public int getHeaderStyle() { return headerStyle; } public void setHeaderStyle(int headerStyle) { this.headerStyle = headerStyle; } }
(8)getHeader设置表头样式公用方法:
/** * 设置表头 * @Description: * @param header * @param type width 表示高度 format 表示格式 style 表示 样式 * style 1 表示反斜杠日期格式 如:YYYY/MM/DD * @param obj 多个值 obj 设置1个值时 设置对应的 type 例:width 后只有一个 obj 表示 设置宽度 * obj 设置2个值时 不设置对应的type 例:width 后只有二个 obj 表示 设置fromat + style 此处注意顺序 * obj 值顺序 width > format > style 默认顺序。 * 当不设置某个值时类推 * @return */ public static HeaderEntity getHeader(String header,String type, int ...obj){ HeaderEntity entity = new HeaderEntity(); entity.setHeaderTitle(header); switch (obj.length) { case 1: if(StringUtils.equals(type, "width")){ entity.setHeaderWidth(obj[0]); } if(StringUtils.equals(type, "format")){ entity.setHeaderFormat(obj[0]); } if(StringUtils.equals(type, "style")){ entity.setHeaderStyle(obj[0]); } break; case 2: if(!StringUtils.equals(type, "width")){ entity.setHeaderFormat(obj[0]); entity.setHeaderStyle(obj[1]); } if(StringUtils.equals(type, "format")){ entity.setHeaderWidth(obj[0]); entity.setHeaderStyle(obj[1]); } if(!StringUtils.equals(type, "style")){ entity.setHeaderWidth(obj[0]); entity.setHeaderFormat(obj[1]); } break; default: break; } return entity; }