Java方式导出EXCEL表格
阅读原文时间:2023年07月10日阅读:2

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

求,但是当时也没有做就搁浅了下来,这次补上。



一、业务开发描述

有一个功能需求是做一了一个表格,在上方输入框栏目输入相关数据以后,点击开始计算,依照相关公式计算出数据,并存至数据库,然后点击导出数据按钮,导出数据为.xls格式的文件。

其实做这部分需求的时候,有一个领悟,发现有时候做程序是以程序员的思维去做程序,如何如何实现等,但是如果自己将来要带团队的话,对功能需求应该是以客户的角度来审查思考,这样对于功能的理解会更加透彻和更亲近于客户,毕竟好的产品是要留给客户是要的,只有做出客户满意的产品,才是最有意义的。

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

首先,在输入框输入数据,然后点击开始计算,在这地方遇到了一个小坑,有一个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,请重新输入!');
        }
    }
}

下面的表格计算出数据以后,点击数据导出功能模块,导出.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);
    }

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章