Java,Web前端发送请求下载Excel表格,通过勾选列表数据下载

实现思路:

    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;
	} 


猜你喜欢

转载自blog.csdn.net/abc231218/article/details/80515295