下面讲解一种通过ajax请求,然后导出Excel的方法。
struts的配置如下:
<package name="crankcall" extends="json-default" namespace="/crankcall"> <!-- 下载导出excle --> <action name="exportExcel" class="....action.ExportExcelAction" method="download" > <result name="excel" type="stream"> <!-- ISO8859-1 --> <param name="contentType">application/vnd.ms-excel,charset=UTF-8</param> <param name="contentDisposition"> p_w_upload;filename="${fileName}.xlsx" </param> <param name="bufferSize">4096</param> <param name="inputName">excelFile</param> </result> <result name="error" type="stream"> <param name="contentType">text/html</param> <param name="inputName">excelFile</param> </result> </action> </package> |
ExportExcelAction中的方法如下:
pubic InputStream excelFile; // 下载文件流 private String fileName; // 下载文件名称
public String download() throws Exception { /* 使用POI来创建表格,datas为要导出的数据。 WorkbookUtil为自定义的工具类 * / XSSFWorkbook workbook =WorkbookUtil.createWorkBook(datas); if(workbook == null){ log.info("导出数据失败"); return ERROR ; } ByteArrayOutputStream output = new ByteArrayOutputStream(); workbook.write(output); byte[] ba = output.toByteArray(); excelFile = new ByteArrayInputStream(ba); output.flush(); output.close(); return "excel"; }
public String getFileName() { String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) ; fileName = fileName+timestamp ; try { /** * 注意,编码是为GBK,就算项目中是UTF8也好。 * 因为这里的乱码问题大多是由于操作系统的浏览器引起的,所以只有GBK才会正常。 * */ fileName = new String(fileName.getBytes("GBK"),"ISO8859-1") ; } catch (UnsupportedEncodingException e) { fileName = timestamp ; } return fileName; }
private String errHandler(){ try { excelFile = new ByteArrayInputStream("导出失败".getBytes("GBK")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return "error" ; } |
如此一来后台就准备就绪了。下面看看前台怎么做。
1,创建一个JS方法
function exportExcelByForm(fileName){ var mform = document.getElementById('excel_export_form') ; if(mform){ document.body.removeChild(mform) ; } mfrom = document.createElement("form"); mfrom.id = "excel_export_form" ; mfrom.target="_blank" ; mfrom.method="post" ; mfrom.action="crankcall/export/exportExcel.action" ; mfrom.style.display="none" ; var fname = document.createElement("input"); fname.type = "hidden"; fname.name = "fileName"; fname.value = fileName ; mfrom.appendChild(fname);
//TODO 可以继续传递更多的参数或者数据到服务端 document.body.appendChild(mfrom); mfrom.submit(); } |
2,然后可以通过按钮等方式来触发该方法达到下载的作用,例如:
exportExcelByForm("XX报表"); |
以上的方式是通过form表单的提交打开新窗口的方式来达到下载的目的,同时窗口打开后会自动的关闭。
转载于:https://blog.51cto.com/dengshuangfu/1712179