zoukankan      html  css  js  c++  java
  • JXL导出Excel,并提供下载(2:提供下载)

    实现效果:

    项目中使用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();
            }
        }
        
    }
  • 相关阅读:
    倚天
    第5課 森さんは7時に起きます。
    第1課 李さんは中国人です
    一个整体的规划
    こんにちは
    原始凭证
    第3課 ここはデパートです
    ERP术语
    第2課 これはほんです
    vc 问题总结
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/8432447.html
Copyright © 2011-2022 走看看