easypoi生成动态excel

该博客介绍了两种在Java中动态生成Excel的方法:使用ExcelExportEntity和动态注解。ExcelExportEntity方式通过自定义实体类来设置表头和数据,隐藏字段不会出现在导出文件中。动态注解方式则允许在运行时修改对象的Excel注解,隐藏的列在Excel中默认隐藏但可被操作显示。这两种方法在导出数据和处理隐藏列上有不同策略。
摘要由CSDN通过智能技术生成

一.使用ExcelExportEntity 方式

1.设置数据库字段表,用来存储excel表头

@Data
public class DynamicPo {
    //展示列名
    private String label;
    //key值
    private String prop;
    //是否可以编辑
    private Boolean disable;
    //是否展示
    private Boolean show;
    //排序
    private Integer sortNo;
}

2.根据数据库表的数据,获取动态列

 /**
     * @Description //TODO 设置动态列
     * @Param [roomShow]
     * @return java.util.List<cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity>
     * @Date 2022/11/23 15:14
     * @Author jiangb
     **/
    public List<ExcelExportEntity> dynaCol(List<DynamicPo> dynamicPoList) {
        List<ExcelExportEntity> colList = new ArrayList<>();
        dynamicPoList.forEach(info->{
            if(info.getShow()){
                colList.add(new ExcelExportEntity(info.getLabel(), info.getProp()));
            }
        });
        return colList;
    }

3.获取每个字段需要的数据,list是需要导出的数据数组

/**
     * @Description //TODO 根据需要获取数据
     * @Param [roomShow, list]
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     * @Date 2022/11/24 15:19
     * @Author jiangb
     **/
    public List<Map<String,Object>> getListMap(List<DynamicPo> dynamicPoList,List<T> list){
        //获取需要导出的字段和排序
        Map<String,DynamicPo> courtyardWarn = dynamicPoList.stream().collect(Collectors.toMap(DynamicPo::getProp, a -> a, (k1, k2) -> k1));
        List<Map<String,Object>> mapList=new ArrayList<>();
        //迭代数据,获取导出字段所需要的数据和排序
        list.forEach(info->{
            Map<String,Object>map=new HashMap<>();
            //获取所有树形
            Field[] fields = info.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                try {
                    //获取配置字段的树形,show为false的字段不需要赋值
                    if(courtyardWarn.get(field.getName())!=null&&courtyardWarn.get(field.getName()).getShow()){
                        map.put(field.getName(), field.get(info));
                    }
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
            mapList.add(map);
        });
        return mapList;
    }

4.导出

    /**
     * @Description //TODO 导出动态excel
     * @Param [dynamicPoList, list, title, fileName, response]
     * @return void
     * @Date 2022/11/24 15:23
     * @Author jiangb
     **/
    public void exportDynamicExcel(List<DynamicPo> dynamicPoList, List<T>list, String title, String fileName, HttpServletResponse response){
        ExcelDynamicUtils excelDynamicUtils=new ExcelDynamicUtils();
        List<ExcelExportEntity> beanList = excelDynamicUtils.dynaCol(dynamicPoList);
        List<Map<String,Object>>maplits=excelDynamicUtils.getListMap(dynamicPoList,list);
        HSSFWorkbook workbook = (HSSFWorkbook) ExcelExportUtil.exportExcel(new ExportParams(title,"1"), beanList, maplits);
        EasyPoiUtils.downLoadExcel(fileName, response, workbook);
    }

二.使用动态注解的方式

1.设置动态注解

 /**
     * @Description //TODO 设置动态注解
     * @Param [columnName, target, sortNo, t]
     * @return void
     * @Date 2022/11/24 16:44
     * @Author jiangb
     **/
    public void dynamicColumn(String columnName, Boolean target,String sortNo,T t) throws Exception {
        // 获取对象树形
        Field field = t.getClass().getDeclaredField(columnName);
        // 获取excel注解对象
        Excel excelAnnon = field.getAnnotation(Excel.class);
        // 获取代理
        InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelAnnon);
        Field excelField = invocationHandler.getClass().getDeclaredField("memberValues");
        // 打开权限
        excelField.setAccessible(true);
        Map memberValues = (Map) excelField.get(invocationHandler);
        // 是否隐藏
        memberValues.put("isColumnHidden", target);
        //排序值
        memberValues.put("orderNum", sortNo);
    }

2.给每个对象设置注解

/**
     * @Description //TODO 动态列设置
     * @Param [list, roomShow]
     * @return void
     * @Date 2022/11/23 15:11
     * @Author jiangb
     **/
    public void dynamicExcel(List<T> list, List<DynamicPo> dynamicPoList) {
        if (CollectionUtil.isNotEmpty(list)) {
            for (T vo : list) {
                ExcelDynamicUtils easyPoiUtil = new ExcelDynamicUtils();
                try {
                    for(int i=0;i<dynamicPoList.size();i++){
                        DynamicPo dynamicPo=dynamicPoList.get(i);
                        //在页面上true代表显示,但是在注解中,true代表隐藏
                        easyPoiUtil.dynamicColumn(dynamicPo.getProp(), !dynamicPo.getShow().equals(true),dynamicPo.getSortNo()+"",vo);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

3.导出

        ExcelDynamicUtils.getInstance().dynamicExcel(list,dynamicPoList);
        EasyPoiUtils.exportExcel(list, title, "1", User.class, fileName, response);

注:第二种方式所有字段都会导出,设置隐藏的列会在EXCEL中隐藏,但是操作excel还是能让隐藏的列显示,第一种方式隐藏的列不会导出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Easypoi生成复杂Excel需要以下步骤: 1. 引入Easypoi的Maven依赖 ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>5.1.0</version> </dependency> ``` 2. 创建JavaBean作为Excel的数据模型,并使用Easypoi的注解进行配置,例如: ```java public class User { @Excel(name = "姓名", orderNum = "0") private String name; @Excel(name = "年龄", orderNum = "1") private Integer age; @Excel(name = "性别", orderNum = "2", replace = {"男_1", "女_2"}) private Integer gender; // 省略getter和setter方法 } ``` 3. 创建Excel导出的控制器,并使用Easypoi提供的API生成Excel文件,例如: ```java @RestController @RequestMapping("/excel") public class ExcelController { @GetMapping("/export") public void export(HttpServletResponse response) throws IOException { List<User> userList = new ArrayList<>(); userList.add(new User("张三", 20, 1)); userList.add(new User("李四", 25, 1)); userList.add(new User("王五", 30, 2)); ExportParams exportParams = new ExportParams("用户信息", "用户"); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, User.class, userList); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户信息.xlsx", "UTF-8")); workbook.write(response.getOutputStream()); } } ``` 4. 使用Easypoi的其他特性,如自定义样式、合并单元格、图片导出等,进行Excel的定制化开发。 Easypoi具有较高的灵活性和可扩展性,可以满足大部分复杂Excel生成需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值