实现效果:
项目中使用JXL生成Excel,使生成的Excel可以让用户下载,如下图
一、生成Excel
二、提供下载
实现思路:
1、页面使用form表单提交方式(Ajax提交方式,只能使用原生Ajax,jquery的ajax不可以)
2、后台使用HttpServletResponse响应前台form表单的请求(我这里使用Servlet类响应,比较古老,^_^)
3、
(1)生成的Excel表,先保存到服务器(JXL的write()方法)
(2)DataInputStream以流的方式读取这个Excel表
(3)DataOutputStream以流的方式输出,用户即可下载
(4)删除第一步保存的Excel表
PS:虽然我也不想这么麻烦,但是浪费了一天时间后,貌似只有这种方法
实现代码:
1、前台:提交表单
JS:
downloadTemplate('exportExcelServlet.exportExcelServlet','filename',id);
表单:
/** * js创建form表单的提交(我的页面没写form表单),采用post方式提交(这里不用改) * @param action action映射地址:web.xml配置了Servlet响应类 * @param type: 名称 * @param value:表单传给后台的值 */ function downloadTemplate(action, type, value){ var form = document.createElement('form'); document.body.appendChild(form); form.style.display = "none"; form.action = action; form.id = 'excel'; form.method = 'post'; var newElement = document.createElement("input"); newElement.setAttribute("type","hidden"); newElement.name = type; newElement.value = value; form.appendChild(newElement); form.submit(); }
2、web.xml:配置响应表单的Servlet
/** * web.xml:提交Form表单后,响应的处理类 * 响应以.exportExcelServlet结尾的Action * @param type: 名称 * @param value:表单传给后台的值 */ <servlet> <servlet-name>exportExcelServlet</servlet-name> <servlet-class> Servlet类所在路径.ExportExcelServlet </servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>exportExcelServlet</servlet-name> <url-pattern>*.exportExcelServlet</url-pattern> </servlet-mapping>
3、Servlet
public class ExportExcelServlet extends HttpServlet { /** * serialVersionUID */ private static final long serialVersionUID = -4541729035831587727L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //form表单的value传的值 Long id = Long.valueOf(req.getParameter("filename")); //调用生成Excel的函数,它生成Excel保存到服务器 exportExcel(id); try{ // 清空输出流 resp.reset(); //获取上面生成Excel的路径 String filePath = "路径"; //设置编码方式 resp.setCharacterEncoding("UTF-8"); // 设定输出文件头 resp.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("自定义下载保存的名称","UTF-8")); resp.setContentType("application/ms-excel"); // 流的方式读取保存到服务器的Excel DataInputStream in = new DataInputStream( new FileInputStream(new File(filePath))); // 流的方式输出到浏览器,可下载 OutputStream out = resp.getOutputStream(); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } out.close(); in.close(); //删除刚才保存到服务器的路径的Excel RemoveDirectoryUtil.delSingleFile(filePath); } catch(Exception e){ e.printStackTrace(); } } }