easyExcel实现单sheet多子表,并结合动态表头,复杂表头

一、实现目标

要实现单sheet页面多个不定表头的子表,并且列的值也不同,并且需要有多级表头

在这里插入图片描述

二、官方文档阅读

1.动态表头

在这里插入图片描述

    /**
     * 动态头,实时生成头写入
     * <p>
     * 思路是这样子的,先创建List<String>头格式的sheet仅仅写入头,然后通过table 不写入头的方式 去写入数据
     *
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 然后写入table即可
     */
    @Test
    public void dynamicHeadWrite() {
        String fileName = TestFileUtil.getPath() + "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
        EasyExcel.write(fileName)
            // 这里放入动态头
            .head(head()).sheet("模板")
            // 当然这里数据也可以用 List<List<String>> 去传入
            .doWrite(data());
    }

    private List<List<String>> head() {
        List<List<String>> list = new ArrayList<List<String>>();
        List<String> head0 = new ArrayList<String>();
        head0.add("字符串" + System.currentTimeMillis());
        List<String> head1 = new ArrayList<String>();
        head1.add("数字" + System.currentTimeMillis());
        List<String> head2 = new ArrayList<String>();
        head2.add("日期" + System.currentTimeMillis());
        list.add(head0);
        list.add(head1);
        list.add(head2);
        return list;
    }

2.单页面多子表

使用table去写入
在这里插入图片描述

    /**
     * 使用table去写入
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 然后写入table即可
     */
    @Test
    public void tableWrite() {
        String fileName = TestFileUtil.getPath() + "tableWrite" + System.currentTimeMillis() + ".xlsx";
        // 方法1 这里直接写多个table的案例了,如果只有一个 也可以直一行代码搞定,参照其他案
        // 这里 需要指定写用哪个class去写
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
            // 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
            // 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
            WriteTable writeTable0 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
            WriteTable writeTable1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
            // 第一次写入会创建头
            excelWriter.write(data(), writeSheet, writeTable0);
            // 第二次写如也会创建头,然后在第一次的后面写入数据
            excelWriter.write(data(), writeSheet, writeTable1);
        }

3.复杂表头

在这里插入图片描述

private List<List<String>> head() {
    List<List<String>> list = new ArrayList<List<String>>();
    List<String> head0 = new ArrayList<String>();
	//表头是两层数组,第一层是列,第二层是每列有两个表头,其中第一个是第一级表头
    head0.add("裁剪单01");
    head0.add("字符串");
    List<String> head1 = new ArrayList<String>();
    head1.add("裁剪单01");
    head1.add("数字");
    List<String> head2 = new ArrayList<String>();
    head2.add("裁剪单01");
    head2.add("日期");
    list.add(head0);
    list.add(head1);
    list.add(head2);
    return list;
}
    /**
     * 复杂头写入
     * <p>1. 创建excel对应的实体对象 参照{@link ComplexHeadData}
     * <p>2. 使用{@link ExcelProperty}注解指定复杂的头
     * <p>3. 直接写即可
     */
    @Test
    public void complexHeadWrite() {
        String fileName = TestFileUtil.getPath() + "complexHeadWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, ComplexHeadData.class).head(head()).sheet("模板").doWrite(data());
    }

三、开始编码

测试主类
    @Test
    public void test(){

        //设置请求信息(获取HttpServletResponse,可通过HttpServletResponse给导出数据命名)
        String fileName = "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
        ExcelWriter excelWriter =  EasyExcel.write(fileName).build();
        WriteSheet sheet = EasyExcel.writerSheet(0, "报表数据")
                .build();
        //sheet不要设置表头,在table中设置表头
//        sheet.setHead(head());

        // 创建两个表格,指定需要头
        WriteTable writeTable0 = EasyExcel.writerTable(0).needHead(Boolean.TRUE).build();
        //设置表一表头
        writeTable0.setHead(head());
        WriteTable writeTable1 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
        //设置表二表头这里设置是一样的
        writeTable1.setHead(head());
        // 将多表写到同一个sheet,和excel
        excelWriter.write(data(), sheet, writeTable0);
        excelWriter.write(data(), sheet, writeTable1);
        //完成
        excelWriter.finish();
        System.out.println("报表导出成功!");

    }
数据类LIst获取
private List<List<String>> data() {
    List<List<String>> list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        List<String> data = new ArrayList<>();
        data.add("1");
        data.add("1");
        data.add("1");
        list.add(data);
    }
    return list;
}
表头list
private List<List<String>> head() {
    List<List<String>> list = new ArrayList<List<String>>();
    List<String> head0 = new ArrayList<String>();
	//表头是两层数组,第一层是列,第二层是每列有两个表头,其中第一个是第一级表头
    head0.add("裁剪单01");
    head0.add("字符串");
    List<String> head1 = new ArrayList<String>();
    head1.add("裁剪单01");
    head1.add("数字");
    List<String> head2 = new ArrayList<String>();
    head2.add("裁剪单01");
    head2.add("日期");
    list.add(head0);
    list.add(head1);
    list.add(head2);
    return list;
}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值