easyexcel 复杂表头、动态表头、复杂数据导出(非注解方式)

easyexcel 生成动态复杂表头(非注解)+数据填充(非注解)

实现代码

 @Test
    public void test() throws IOException {
        // 文件输出位置
        OutputStream out = new FileOutputStream("d://test.xlsx");
        ExcelWriter writer = EasyExcelFactory.write(out).build();

        // 动态添加表头,适用一些表头动态变化的场景
        WriteSheet sheet1 = new WriteSheet();
        sheet1.setSheetName("商品明细");
        sheet1.setSheetNo(0);
        // 创建一个表格,用于 Sheet 中使用
        WriteTable   table = new WriteTable( );
        table.setTableNo(1);
        table.setHead(head());
        // 写数据
        writer.write(contentData(), sheet1, table);
        writer.finish();
        out.close();
    }

    private static List <List<String>> head(){
        List<List<String>> headTitles = Lists.newArrayList();
        String basicInfo = "基础资料",skuInfo = "商品扩展",orderInfo = "经营情况",empty = " ";
        //第一列,1/2/3行
        headTitles.add( Lists.newArrayList(basicInfo ,basicInfo,"类别") );
        //第二列,1/2/3行
        headTitles.add( Lists.newArrayList(basicInfo,basicInfo,"名称" ) );
        List<String>  skuTitles = Lists.newArrayList("组合商品", "上一次优惠时间", "销售次数", "库存", "价格");
        skuTitles.forEach(title->{
            headTitles.add( Lists.newArrayList(skuInfo ,skuInfo,title) );
        });
        List<Integer> monthList = Lists.newArrayList(5,6);
        //动态根据月份生成
        List<String> orderSpeaces = Lists.newArrayList("销售额", "客流", "利润");
        monthList.forEach(month->{
            orderSpeaces.forEach(title->{
                headTitles.add( Lists.newArrayList(orderInfo ,  month+"月" ,title ) );
            });
        });
        //无一、二行标题
        List<String> lastList = Lists.newArrayList("日均销售金额(元)", "月均销售金额(元)" );
        lastList.forEach(title->{
            headTitles.add( Lists.newArrayList(empty , empty ,title ) );
        });
        return headTitles;
    }

    private static List <List<Object>> contentData(){
        List<List<Object>> contentList = Lists.newArrayList();
        //这里一个List<Object>才代表一行数据,需要映射成每行数据填充,横向填充(把实体数据的字段设置成一个List<Object>)
        contentList.add( Lists.newArrayList("测试", "商品A","苹果🍎") );
        contentList.add( Lists.newArrayList("测试", "商品B","橙子🍊") );
        return contentList;
    }

Lists这个类是guava的依赖

生成效果图

在这里插入图片描述

  • 40
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
对于复杂自定义表头导出,可以使用EasyExcel注解`@ExcelProperty`来实现。具体步骤如下: 1. 创建表头实体类,使用`@ExcelProperty`注解来定义表头名称和对应的字段。 ```java public class ComplexHeadData { @ExcelProperty({"主标题", "名称"}) private String name; @ExcelProperty({"主标题", "数量"}) private Integer number; @ExcelProperty({"主标题", "价格"}) private Double price; @ExcelProperty({"次标题", "子名称"}) private String subName; @ExcelProperty({"次标题", "子数量"}) private Integer subNumber; @ExcelProperty({"次标题", "子价格"}) private Double subPrice; // 省略getter和setter方法 } ``` 2. 创建导出数据集合,并将数据集合和表头实体类传入`EasyExcel.write()`方法中,使用`Sheet`对象来设置表头。 ```java List<ComplexHeadData> data = ... Sheet sheet = new Sheet(1, 0, ComplexHeadData.class); // 设置主标题行 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("主标题", "名称", "数量", "价格")); // 设置次标题行 head.add(Arrays.asList("次标题", "子名称", "子数量", "子价格")); // 设置表头样式 WriteCellStyle headStyle = new WriteCellStyle(); // ... 设置样式 // 设置主标题行的样式 WriteCellStyle mainHeadStyle = new WriteCellStyle(headStyle); mainHeadStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex()); // 设置次标题行的样式 WriteCellStyle subHeadStyle = new WriteCellStyle(headStyle); subHeadStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 设置主标题行和次标题行的样式 WriteCellStyle headCellStyle = new WriteCellStyle(); headCellStyle.setWrapped(true); headCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); headCellStyle.setMainHeadStyle(mainHeadStyle); headCellStyle.setSubHeadStyle(subHeadStyle); // 设置表头 sheet.setHead(head); sheet.setHeadStyle(headCellStyle); // 写入数据到Excel EasyExcel.write(outputStream, ComplexHeadData.class).sheet().doWrite(data); ``` 通过以上步骤,即可实现复杂自定义表头导出。需要注意的是,`@ExcelProperty`注解中的数组参数表示表头的层级关系,数组的第一个元素为主标题,第二个元素为次标题,以此类推。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值