java hutool导出excel

1. pom文件引入hutool

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.12</version>
</dependency>

2. 实现

 /**
     * 
     * @param exhibitCkVos 传入的list
     * @param response 回传文件流时使用
     * @return
     * @throws IOException
     */
public Object createTzExcel1(List<ExhibitCkVo> exhibitCkVos, HttpServletResponse response) throws IOException {
        ExcelWriter writer = ExcelUtil.getWriter();
        // 创建excelwriter并空出一行(如果在设置表头存在合并的时候不会被数据顶掉)
        writer.writeHeadRow(new LinkedList());
        List<List<String>> rows = CollUtil.newArrayList();
        List<String> rowTitle = CollUtil.newArrayList("", "", "名称", "特征", "数量", "单位", "", "", "", "", "");
        //合并单元格后的标题行,使用默认标题样式,当merg当前单元格为空值时merge中的值才回被显示出来,否则会被替换掉
        // 开始行,结束行,开始列,结束列,名称,是否为标题
        writer.merge(0, 1, 0, 0, "序号", true);
        writer.merge(0, 1, 1, 1, "任务名称", true);
        writer.merge(0, 0, 2, 5, "物品详情", true);

        writer.merge(0, 1, 6, 6, "任务类型", true);
        writer.merge(0, 1, 7, 7, "措施类型", true);
        writer.merge(0, 1, 8, 8, "采取措施时间", true);
        writer.merge(0, 1, 9, 9, "物品存放位置", true);
        writer.merge(0, 1, 10, 10, "主办单位", true);
        writer.setOnlyAlias(true);
        //写入标题
        writer.writeHeadRow(rowTitle);
        //定义启始行(第一个合并列)
        AtomicInteger index = new AtomicInteger(2);
        //定义启始行(第二个合并列)...以后的合并列也是一样
        AtomicInteger index2 = new AtomicInteger(2);
        //按照单位分组数据汇总处理
        Map<String, List<ExhibitCkVo>> collect = exhibitCkVos
                .stream()
                .collect(Collectors.groupingBy(i -> i.getUnitName(), LinkedHashMap::new, Collectors.toList()));
        collect.entrySet().stream().forEach(x -> {
            List<ExhibitCkVo> value = x.getValue();
            if (value.size() == 1) {
                //只有 一条数据,换行
                index.set(index.get() + 1);
                index2.set(index2.get() + 1);
            } else {
                //合并行
                writer.merge(index.get(), index.get() + value.size() - 1, 10, 10, "", false);
                index.set(index.get() + value.size());
                //按照案件名称分组数据汇总处理
                LinkedHashMap<String, List<ExhibitCkVo>> collect1 = value.stream().collect(Collectors.groupingBy(i -> i.getAjmc(), LinkedHashMap::new, Collectors.toList()));
                collect1.entrySet().stream().forEach(y -> {
                    List<ExhibitCkVo> value1 = y.getValue();
                    if (value1.size() == 1) {
                        index2.set(index2.get() + value1.size());
                    } else {
                        writer.merge(index2.get(), index2.get() + value1.size() - 1, 1, 1, value.get(0).getAjmc()+"\n"+value.get(0).getAjbh(), false);
                        index2.set(index2.get() + value1.size());
                    }
                });
            }
        });
        //保存数据
        exhibitCkVos.stream().forEach(x -> {
                    List<String> rowA = CollUtil.newArrayList(
                            "",
                            x.getAjmc() + "\n" + x.getAjbh(),
                            x.getExhibitName(),
                            x.getWptz(),
                            x.getSl(),
                            x.getDw(),
                            x.getAjlx(),
                            x.getCslx(),
                            x.getRkTime(),
                            x.getCcwz(),
                            x.getUnitName()
                    );
                    rows.add(rowA);
                }
        );
        //一次性写出内容,强制输出标题
        writer.write(rows, true);
        long lon = System.currentTimeMillis();
        String id = lon + "";
        Random random = new Random();
        for( int i = 0; i < 4; i++ ) {
            id = id + random.nextInt(10);
        }

        String filePath = docDir + id + ".xls";
        File outFile = new File(filePath);
        if (!outFile.getParentFile().exists()) {
            outFile.getParentFile().mkdirs();
        }
        OutputStream os = null;
        try {
            os = new FileOutputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return JsonResult.error(203, e.getMessage());
        }
        writer.flush(os, true);
        // 关闭writer,释放内存
        writer.close();
        //此处记得关闭输出Servlet流
        IoUtil.close(os);
        return JsonResult.success(docMain + id + ".xls");
    }

最终表格样式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

vace cc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值