zoukankan      html  css  js  c++  java
  • Java方式导出EXCEL表格

    最近几天做公司项目,应客户需求需要将表单的数据下载本地存成.xls文件。之前做毕设的时候,就有类似这方面的功能需
    求,但是当时也没有做就搁浅了下来,这次补上。



    一、业务开发描述

    有一个功能需求是做一了一个表格,在上方输入框栏目输入相关数据以后,点击开始计算,依照相关公式计算出数据,并存至数据库,然后点击导出数据按钮,导出数据为.xls格式的文件。
    
    其实做这部分需求的时候,有一个领悟,发现有时候做程序是以程序员的思维去做程序,如何如何实现等,但是如果自己将来要带团队的话,对功能需求应该是以客户的角度来审查思考,这样对于功能的理解会更加透彻和更亲近于客户,毕竟好的产品是要留给客户是要的,只有做出客户满意的产品,才是最有意义的。
    

    二、前台jsp页面及js源码相关

    2.1开始计算

    补贴资金

    首先,在输入框输入数据,然后点击开始计算,在这地方遇到了一个小坑,有一个js校验方法。

    校验描述:

    平台考核权重+现场考核权重<=100

    给这两个输入框添加onchange()事件进行校验判断:

    function regs(){
        var ptkhQz = $("#ptkhQz").val();
        var xckcQz = $("#xckcQz").val();
        //本意为:如果平台考核权重和现场考核权重都不为空,则进行下面的判断
        //这地方我发现一直有bug,它总是在我输入第一个的时候就弹出校验信息,没有走第一个if判断
        //后来排查发现,输入框输入的数据如果为空,其是空字符串,即""这种形式
        //后来将代码重新修改为:(ptkhQz!=""&&xckcQz!="")即可成功运行
        if(ptkhQz!=null&&xckcQz !=null){
            if(Number(ptkhQz)+Number(xckcQz)>100){
                $.alert('平台考核权重与现场考察权重值之和大于100,请重新输入!');
            }
        }
    }

    2.2数据导出

    下面的表格计算出数据以后,点击数据导出功能模块,导出.xls格式的数据。

    jsp:首先在页面下方添加一个隐藏的iframe标签,这样当点击数据导出的时候,弹窗。

    <iframe id="hidden_frame1" style='display: none'></iframe>

    js:

    <script type="text/javascript">
    function exportResult() {
        //上方输入框输入的数据,根据id取值
        var ptkhQz = $("#ptkhQz").val();
        var xckcQz = $("#xckcQz").val();
        //收集数据
        var gridData = ajaxgrid.collectData(false,"all") ;
        var dataArr = [] ;
        dataArr.push(gridData) ;
        //实现方式:先是执行后台exportData方法,生成excel格式的文件,然后在执行下面的download的方法,下载该excel文件
        $.request({
            //首先导出数据,生成一份excel文件
            action:"exportData",
            data:dataArr,
            params:{'ptkhQz':ptkhQz, 'xckcQz':xckcQz},
            success:function(response){
                var filePath = response.getParameter("filePath");
                //下载至本地
                 $("#hidden_frame1").attr("src", "gjSubsidyMoneyList.do?action=download&filePath=" + filePath);
            }
        }) ;
    }
    </script>

    三、后台action

    后台action实现接口:

        implements ServletResponseAware
    
    
        @Override
        public void setServletResponse(HttpServletResponse arg0) {
            this.response = arg0;
        }

    然后添加两个对象,并添加他们的set和get方法

        private HttpServletResponse response;
        private String filePath;
        //添加set,get方法

    exportData方法,导出excel文件:

        public void exportData() throws Exception{
            List<GjSubsidyMoney> dataList = dataWrap.getDataList();
            String localName = ApplicationUtil.getAppConfig().getAppExtProp().get("fileTempPath") + "/" + "补贴资金.xls";
            //执行servicel中的导出数据方法,传入相关参数
            gjSubsidyMoneyService.exportData(xckcQz, dataList, localName);
            responseData.setParameter("filePath", localName);
        }

    download方法,下载.xls格式的文件:

    public void download() {
            File file = null;  
            InputStream fin = null;  
            ServletOutputStream out = null;  
            try {  
                file = new File(filePath);
                fin = new FileInputStream(file);  
    
                response.setCharacterEncoding("utf-8");  
                response.setContentType("application/vnd.ms-excel");  
                String defaultname = "补贴资金.xls";
                String fileName = new String(defaultname.getBytes("utf-8"), "ISO8859_1");
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);  
    
                out = response.getOutputStream();  
                byte[] buffer = new byte[512];  // 缓冲区  
                int bytesToRead = -1;  
                // 通过循环将读入的Word文件的内容输出到浏览器中  
                while((bytesToRead = fin.read(buffer)) != -1) {  
                    out.write(buffer, 0, bytesToRead);  
                }  
            } catch(Exception e) {e.printStackTrace();}
            finally {  
                if(fin != null)
                    try {
                        fin.close();
                        if(out != null) out.close(); 
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }  
            }  
        }

    四、servicel中的导出数据方法及设置excel格式

    public void exportData(BigDecimal ptkhQz, BigDecimal xckcQz, List<GjSubsidyMoney> dataList, String filePath) throws Exception {
            HrExcelUtil excelUtil = new HrExcelUtil("补贴资金");
            //创建列及列的宽度,该地方创建了20列,每个列的宽度为5
            excelUtil.setColumnWidth(new int[] { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
                    5, 5 });
    
            //创建行,列、行的开始行列号都是从0开始
            excelUtil.createRow();
            //第一行第一列的内容
            excelUtil.addValue("XX年度贵州省公交优先得分说明和补贴资金分配表");
            //第一行第二列的内容
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            excelUtil.addValue("");
            //合并单元格:
            //参数说明:第一个参数:合并单元格的开始行号,第二个参数:合并单元格的结束行号
            //第三个参数:合并单元格的开始列号    第四个参数:合并单元格的结束列号
            excelUtil.mergeRegion(0, 0, 0, 19);
    
    
            for (int i = 0; i < dataList.size(); i++) {
                GjSubsidyMoney subsidyMoney = dataList.get(i);
                //创建一行
                excelUtil.createRow();
                //总共有20列,从左右往右,依次给每一个列进行相关赋值操作
                excelUtil.addValue(i + "");  // 序号
                excelUtil.addValue(GjCommonUtil.getDropLabel(subsidyMoney.getSubsidyCity()+""));  // 城市
                excelUtil.addValue(subsidyMoney.getTotalRecord() + "");  // 年度总得分
            }
    
            excelUtil.createExcel(filePath);
        }

    至此,该功能需求实现完成。

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/aixing/p/13327537.html
Copyright © 2011-2022 走看看