页面通过ajax请求到后台通过POI导出Excel

1、前端使用原生AJAX请求后台并接受后台返回的二进制流文件进行导出excel操作

exportExcel(){
//获取yyyyMMddHHmmss
     function getFormatDate() {
         var date = new Date();
         var month = date.getMonth() + 1;
         var strDate = date.getDate();
         if (month >= 1 && month <= 9) {
             month = "0" + month;
         }
         if (strDate >= 0 && strDate <= 9) {
             strDate = "0" + strDate;
         }
         return date.getFullYear() + month + strDate
             + date.getHours() + date.getMinutes() + date.getSeconds();
     }
     //原生ajax
     var xhr = new XMLHttpRequest();
     //post方式请求后台的路径
     xhr.open('post', `请求路径`, true);
     //导出的Excel是二进制数据类型,所以设置为blob
     xhr.responseType = 'blob';
     //请求头(key,value),请求头可以设置多个key-value对
     xhr.setRequestHeader('Content-Type', 'application/json;charset=utf-8');
     //返回成功,导出的Excel文件
     xhr.onload = function () {
         if (this.status == 200) {
             var blob = this.response;
             var a = document.createElement('a');
             var url = window.URL.createObjectURL(blob);
             a.href = url;
             //设置文件名称
             a.download = "导出表格"+getFormatDate()+".xlsx";
             a.click();
             // 5.释放这个临时的对象url
             window.URL.revokeObjectURL(url);
         }
     }
     //请求的参数,json格式,后台要用json格式接收
     xhr.send(JSON.stringify({
         "param1": "testData",
         "param2": "testData",
         "param3": "testData",
         "param4": "testData",
         "param5": "testData"
     }));
 },

2、后台接收参数并返回二进制文件流

 @RequestMapping("/exporExcel")
    public Result exportExcel(@RequestBody Params params, HttpServletRequest request, HttpServletResponse response){
        Result result = new Result();
        String name =  "导出表格";
        try {
            String filename = name + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xlsx";
            //获取导出表格实体类list,导出表格实体类中的字段需要使用@Excel注解
            List<Params> paramsList = iParamService.getList();
            Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(name,name),Params.class,paramsList );
            if (workbook != null) {
                EasypoiUtil.downLoadExcel(filename, response, workbook);
            }
        } catch (Exception e) {
            e.printStackTrace();
            result.setMsg(e.toString());
            result.setCode(ResultEnum.EREOR.getCode());
            return result;
        }
        return null;
    }

3、EasypoiUtil.java

public abstract class EasypoiUtil {
    public EasypoiUtil() {
    }

    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-Type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        response.setCharacterEncoding("UTF-8");
        workbook.write(response.getOutputStream());
    }

    private static String filename(HttpServletRequest request, String filename) throws Exception {
        String userAgent = request.getHeader("User-Agent");
        if (!userAgent.contains("MSIE") && !userAgent.contains("Trident")) {
            filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
        } else {
            filename = URLEncoder.encode(filename, "UTF-8");
        }

        return filename;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cplianxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值