• 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);
        }

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

  • 相关阅读:
    slice和splice的区别
    Js中获取对象的所有key值
    设置layUI的时间laydate 结束时间大于开始时间
    vscode前端常用插件推荐,搭建JQuery、Vue等开发环境
    安装vue脚手架
    es6中...是什么意思
    html转义字符换行以及回车等的使用
    10款让人惊叹的HTML5/jQuery图片动画特效
    基于GIS技术的水利一张图平台
    BIM + 3D GIS在岩溶强发育区跨海盾构隧道施工中的实践应用
  • 原文地址:https://www.cnblogs.com/aixing/p/13327537.html
Copyright © 2020-2023  润新知