Java利用POI实现导出excel文件

来源:互联网 发布:java character 编辑:程序博客网 时间:2024/04/27 20:23

项目中要实现导出excel功能,下面是一个公共方法:

环境:JDK1.8,poi-3.14

项目中js请求是ajax请求。

因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。

本例中我们先将excel文件下载到服务端,然后前台点击导出excel按钮,从服务端下载相应的文件。

下面代码片是DataExportUtil工具类,控制层传入3个参数就可以实现excel导出:


下面是js请求的代码,ajax请求我们是封装了下的:

$('#export-table-excle').on('click',function(){    var tableHeader = "项目名称,项目编号,客户名称,客户联系人,活动名称,活动日期,活动地点,我方参与人员,活动目的,会议纪要,关键问题及困难说明,评分";    var params = {                "other": {                "isManager": isManager,                "shortNo": shortNo,                "tableHeader": tableHeader,                "sheetName": "客户公关活动汇总"                }        }    demo.ajax.postUrl("/summary/getExcel.serv", params,                function (ret) {                    if (ret != null && ret.code != null && ret.code.code != null && ret.code.code == '0000') {                    var name = ret.bo; //name是excel的文件名                    var url = "127.0.0.1:8080/demo/export/" + name; //在项目webapp下的export文件夹下载文件                    window.open("http://" + url);                    }                    else {                        //服务器操作失败,不关闭对话框                    }                    return;                }        );        });


下面是控制层代码:

@RequestMapping(value = "/getExcel.serv", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)    @ResponseBody    public ServiceData getExcel(HttpServletRequest request, @RequestBody FormData<SummaryListModel> form) throws Exception    {      //返回统一的服务端数据        ServiceData ret = new ServiceData();        Map<String, Object> map = new HashMap<String, Object>();        //传入url参数        if (form.getOther().containsKey("shortNo") && form.getOther().containsKey("isManager"))        {            String shortNo = (String)form.getOther().get("shortNo");            String isManager = (String)form.getOther().get("isManager");          //设置查询条件            map.put("shortNo", shortNo);            map.put("isManager", isManager);        }        String tableHeader = (String)form.getOther().get("tableHeader");         String[] titleColumns = tableHeader.trim().split(","); //获取表头        String sheetName = (String)form.getOther().get("sheetName"); //获取表名        List<Object[]> dataList = new ArrayList<Object[]>();        dataList = summaryService.getList(map); //查询数据库中数据,获取数据        String name = DataExportUtil.exportDataToExcel(sheetName, titleColumns, dataList); //调用导出excel工具类        ret.setCode(request, ServiceData.RetCode.Success);        ret.setBo(name);        return ret;    }


如果js使用的不是基于ajax的请求,如果是form表单提交,那么控制层可以写为:

@RequestMapping(value = "/getExcel.serv", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)    @ResponseBody    public ServiceData getExcel(HttpServletRequest request, HttpServletResponse response, @RequestBody FormData<SummaryListModel> form) throws Exception    {      //返回统一的服务端数据        ServiceData ret = new ServiceData();        Map<String, Object> map = new HashMap<String, Object>();        //传入url参数        if (form.getOther().containsKey("shortNo") && form.getOther().containsKey("isManager"))        {            String shortNo = (String)form.getOther().get("shortNo");            String isManager = (String)form.getOther().get("isManager");          //设置查询条件            map.put("shortNo", shortNo);            map.put("isManager", isManager);        }        String tableHeader = (String)form.getOther().get("tableHeader");         String[] titleColumns = tableHeader.trim().split(","); //获取表头        String sheetName = (String)form.getOther().get("sheetName"); //获取表名try{//设置headerresponse.setHeader("Content-Disposition","attachment; filename=\""+new String((sheetName).getBytes("gb2312"),"ISO-8859-1")+".xls\"");OutputStream out = response.getOutputStream();List<Object[]> dataList = new ArrayList<Object[]>();dataList = summaryService.getList(map); //查询数据库中数据,获取数据//此时将工具类中的参数改为4个,exportDataToExcel、writeToFile方法上加上OutputStream out,工具类中的writeToFile方法try中修改为//workbook.write(out);  这一条语句就ok了,浏览器会自动弹出选择文件夹的框String name = DataExportUtil.exportDataToExcel(out,sheetName, titleColumns, dataList); //调用导出excel工具类ret.setCode(request, ServiceData.RetCode.Success);ret.setBo(name);out.close();}catch (IOException e) {e.printStackTrace();}        return ret;    }


1 0
原创粉丝点击