EasyExcel 简单 动态表头,复杂数据,response输出文件流,浏览器下载导出

本文介绍了如何使用EasyExcel实现动态表头的Excel导出,结合Controller层代码展示了如何根据数据库查询结果动态生成不同产品的属性列,并通过response输出文件流,实现在浏览器中下载导出Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyExcel动态表头,复杂数据导出

最终效果图

该导出报表是使用response输出文件流,浏览器下载导出Excel文件

下图为最终导出的效果
在这里插入图片描述
在这里插入图片描述

Controller层代码

 @GetMapping("/Export")
    public void weekExport(HttpServletResponse response, VoucherTableHeadVO voucherTableHeadVO) {
        try {
            String sheetName = "化验周报表";
            String fileName = sheetName.concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx");

            //设置单元格合并策略
            //LoopMergeStrategy(行数, 列数)合并
            LoopMergeStrategy loopMergeStrategy1 = new LoopMergeStrategy(4, 0);
            LoopMergeStrategy loopMergeStrategy2 = new LoopMergeStrategy(4, 1);
            LoopMergeStrategy loopMergeStrategy3 = new LoopMergeStrategy(4, 2);
            LoopMergeStrategy loopMergeStrategy4 = new LoopMergeStrategy(4, 3);
            LoopMergeStrategy loopMergeStrategy5 = new LoopMergeStrategy(4, 4);

            //表头数据
            List<List<String>> headList =voucherQualityService.setHeadList(voucherTableHeadVO);
            //表数据
            List<List<Object>> lists = voucherQualityService.setWeekList(voucherTableHeadVO);
            //response输出文件流
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
            //写入表头,模板,单元格合并策略,表数据
            EasyExcel.write(response.getOutputStream()).head(headList).sheet("Sheet1").registerWriteHandler(loopMergeStrategy1).registerWriteHandler(loopMergeStrategy2)
                    .registerWriteHandler(loopMergeStrategy3)
                    .registerWriteHandler(loopMergeStrategy4)
                    .registerWriteHandler(loopMergeStrategy5)
                    .doWrite(lists);

            System.out.println("导出成功!");

        }catch (Exception e){

        }
    }

动态表头

表头后半部分的属性是通过查询数据库获得的,每种产品对应的属性数和属性均不相同

@Override
    public List<List<String>> setHeadList(VoucherTableHeadVO voucherTableHeadVO) {
        List<String> headTitle0 = new ArrayList<String>();
        List<String> headTitle1 = new ArrayList<String>();
        List<String> headTitle2 = new ArrayList<String>();
        List<String> headTitle3 = new ArrayList<String>();
        List<String> headTitle4 = new ArrayList<String>();
        List<String> headTitle5 = new ArrayList<String>();
        headTitle0.add("时间");
        headTitle1.add("客户");
        headTitle2.add("合同名称");
        headTitle3.add("产品名称");
        headTitle4.add("总吨数");
        headTitle5.add("数据类型");
        //这个list是查询出的该产品所关联的属性
        List<VoucherTableHeadVO> list = voucherQualityMapper.getTableHead(voucherTableHeadVO);
        List<List<String>> qualiyuNameAll = new ArrayList<List<String>>();
        qualiyuNameAll.add(headTitle0);
        qualiyuNameAll.add(headTitle1);
        qualiyuNameAll.add(headTitle2);
        qualiyuNameAll.add(headTitle3);
        qualiyuNameAll.add(headTitle4);
        qualiyuNameAll.add(headTitle5);
        for (int i=0;i<list.size();i++) {
            List<String> qualityNames = new ArrayList<String>();
            String qualityName =  list.get(i).getQualityName();
            qualityNames.add(qualityName);
            qualiyuNameAll.add(qualityNames);
        }
            return qualiyuNameAll;
    }

表数据

 @Override
    public List<List<Object>> setWeekList(VoucherTableHeadVO voucherTableHeadVO) {
        List<List<Object>> lists = new ArrayList<List<Object>>();
        int count = 0;
        for(int i=0;i<4;i++){
            List<Object> list = new ArrayList<>();
            VoucherTableHeadVO vo = voucherQualityMapper.getWeekTableContent(voucherTableHeadVO);
            if (count == 0) {
                list.add(voucherTableHeadVO.getBookStartTime()+"至"+voucherTableHeadVO.getBookEndTime());
                list.add(vo.getCustName());
                list.add(vo.getContractName());
                list.add(vo.getProdName());
                list.add(vo.getNetWeight());
                list.add("化验次数");
                List<VoucherTableHeadVO> timeList = voucherQualityMapper.getTestTime(voucherTableHeadVO);
                for(int j=0;j<timeList.size();j++){
                    Integer time = timeList.get(j).getTime();
                    list.add(time);
                }
            } else if (count == 1) {
                list.add("");
                list.add("");
                list.add("");
                list.add("");
                list.add("");
                list.add("指标要求");
                List<VoucherTableHeadVO> passRateList = getPassRate(voucherTableHeadVO);
                for(int j=0;j<passRateList.size();j++){
                    String label = passRateList.get(j).getLabel();
                    Double standard = passRateList.get(j).getStandard();
                    list.add(label+standard);
                }
            } else if (count == 2) {
                list.add("");
                list.add("");
                list.add("");
                list.add("");
                list.add("");
                list.add("加权平均");
                List<VoucherTableHeadVO> weightedMeanlist = getWeightedMean(voucherTableHeadVO);
                for(int j=0;j<weightedMeanlist.size();j++){
                    BigDecimal weightedMean = weightedMeanlist.get(j).getWeightedMean();
                    list.add(weightedMean);
                }
            } else if (count == 3) {
                list.add("");
                list.add("");
                list.add("");
                list.add("");
                list.add("");
                list.add("合格率");
                List<VoucherTableHeadVO> passRateList = getPassRate(voucherTableHeadVO);
                for(int j=0;j<passRateList.size();j++){
                    Double PassRate = passRateList.get(j).getPassRate();
                    list.add(PassRate+"%");
                }
            }
            lists.add(list);
            count++;
            if(count >3){
                count = 0;
            }
        }
        return lists;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值