实现效果:

项目中使用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();
        }
    }
    
}

 

 posted on 2018-02-08 17:23  布鲁布鲁sky  阅读(311)  评论(0编辑  收藏  举报