导出文件 EasyExcelUtil

本文档详细介绍了如何使用EasyExcel库在Java中导出包含复杂转换和处理的数据到Excel报表。首先,确保报表类的属性与列表数据的属性匹配,并使用BeanUtils进行复制赋值。然后,通过枚举和数据字典转换特殊属性值。最后,调用EasyExcelUtil的writeSingleExcel方法导出数据到Excel文件。

指定包:import com.opencloud.kamaitachi.server.utils.EasyExcelUtil;

EasyExcelUtil.writeSingleExcel("文件名","表名","要写的内容集合","要写的内容类")
例如:
EasyExcelUtil.writeSingleExcel(
 PostedPositionExcelConvert.getFileNmae(query.getType()),                                     PostedPositionExcelConvert.getFileNmae(query.getType()), 
 kamaitachiPositedWorkerExcel,
 KamaitachiPositedWorkerExcelVO.class);
源码:
 public static <T> String writeSingleExcel(
    String fileName, String sheetName, List<T> tList, Class tClass
    )

1.1 工作中的操作

@ApiOperation(value = "导出已浏览、已收藏、已投递职位列表", notes = "导出已浏览、已收藏、已投递职位列表")
    @PostMapping(value = "/exportPostedPositionExcel")
    public ResultBody<String> exportWorkerInfoExcel(@RequestBody KamaitachiPostedPositionConditionDTO query) throws IOException {
        if(query.getChoseDateRange() != null && query.getChoseDateRange() != 0){
            query.setBeginAndEndDate();
        }
        if(Objects.nonNull(query.getMinAge())){
            query.setMinAgeTime(ageToDate(query.getMinAge()));
        }
        if(Objects.nonNull(query.getMaxAge())){
            query.setMaxAgeTime(ageToDate(query.getMaxAge()));
        }
        List<KamaitachiPositedWorkerExcelVO> kamaitachiPositedWorkerExcel = new ArrayList<>();
        List<KamaitachiPositedWorkerVO> list = kamaitachiPostedPositionService.listKamaitachiPositedWorkerVO(query);
        if(list != null && list.size() >0){
            for (KamaitachiPositedWorkerVO kamaitachiPositedWorkerVO:list) {
                KamaitachiPositedWorkerExcelVO kamaitachiPositedWorkerExcelVO = new KamaitachiPositedWorkerExcelVO();
                BeanUtils.copyProperties(kamaitachiPositedWorkerVO, kamaitachiPositedWorkerExcelVO);
                kamaitachiPositedWorkerExcel.add(kamaitachiPositedWorkerExcelVO);
            }
        }
        PostedPositionExcelConvert.getFileNmae(query.getType());
        String downLoadFileName = EasyExcelUtil.writeSingleExcel(PostedPositionExcelConvert.getFileNmae(query.getType()), PostedPositionExcelConvert.getFileNmae(query.getType()), kamaitachiPositedWorkerExcel, KamaitachiPositedWorkerExcelVO.class);
        return ResultBody.ok(downLoadFileName);
    }

最近完成任务的时候遇到此类数据报表导出问题,因为是前面离职大佬写的,我接手了他的任务。一开始这个任务比较重要且繁多复杂,他在离职前并没有把他全部写好完善好,以至于后面留了很多的bug需要更正修改,同时没做太多的注释说明。刚接手他代码的会比较吃力,但他的思考角度是值得我学习的,他不足的地方也在学习中完善。

1.1.1、前提准备:Excel报表类

为了利用列表数据对Excel数据报表进行赋值,所以务必保证属性和列表类的属性一致,利用BeanUtils.copyProperties(a,b)进行复制赋值,报表类中的属性在数据列表属性中有的话就会覆盖赋值。

利用注解@ExcelProperty("昵称")

示例:Excel报表类中属性

@ExcelProperty("昵称")
private String nickName;
@ExcelProperty("姓名")
private String name;

1.1.2、利用先前列表数据对Excel报表类进行逐一赋值

他是利用先前的列表数据,对iPageResultBody(数据列表)将值进行逐一遍历赋值给Excel报表类属性

ResultBody<Page<KamaitachiWorkerInfoDTO>> iPageResultBody = this.list(query);
List<Object> poList = iPageResultBody.getData().getRecords().stream()
        .map(kamaitachiWorkerInfoDTO -> {
            WorkerInfoPO workerInfoPO = new WorkerInfoPO();
            BeanUtils.copyProperties(kamaitachiWorkerInfoDTO,workerInfoPO);
            ......//(1.1.3)
             return workerInfoPO;
                })
                .collect(Collectors.toList());

1.1.3、对于列表中没有的数据进行设置赋值

对于Excel报表类中特别的数据属性,比如性别,列表给的是1男2女,但在给报表赋值的时候需要变成男女,这时候需要对这些值进行设置赋值

//性别
workerInfoPO.setSex(SexEnum.getSexName(kamaitachiWorkerInfoDTO.getSex()));
//拥有证件
List<KamaitachiWorkerFiles> personalCardFilesList = kamaitachiWorkerInfoDTO.getPersonalCardFilesList();
if(personalCardFilesList != null && personalCardFilesList.size()>0){
    StringBuilder sbWorkerFiles = new StringBuilder();
    for (KamaitachiWorkerFiles kamaitachiWorkerFiles : personalCardFilesList) {
        if(StringUtil.isNotEmpty(kamaitachiWorkerFiles.getFileUrl())){
            sbWorkerFiles.append(kamaitachiWorkerFiles.getCredentialsName()).append('、');
        }
    }
    workerInfoPO.setPersonalCardFiles(sbWorkerFiles.toString());
}
 //实名认证
 workerInfoPO.setIsRealname(RealnameStatusEnum.getName(kamaitachiWorkerInfoDTO.getIsRealname()));
 //利用字典转换学历,须+1
 Integer highestEducationCode = kamaitachiWorkerInfoDTO.getHighestEducationCode();
 if(highestEducationCode != null && highestEducationCode >0){
 if(StringUtil.isNotEmpty(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1))){   workerInfoPO.setHighestEducationName(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1));
     }else{
         workerInfoPO.setHighestEducationName("");
     }
 }

①这里利用了枚举类进行转换

public enum RealnameStatusEnum {

    NO_REALNAME(0, "未实名"),
    YES_REALNAME(1, "已实名"),
    ;

    private Integer code;
    private String msg;

    RealnameStatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public static String getName(Integer code) {
        for (RealnameStatusEnum type : RealnameStatusEnum.values()) {
            if (type.getCode().equals(code)) {
                return type.msg;
            }
        }
        return "";
    }
}

②利用数据字典进行转换

前提系统存在这个字典"KAMA_EDUCATION_REQUIRE"

示例:SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode);
源码:SysDictParseUtil.parseSingleDictValue(dictType,dictCode);

1.1.4 利用EasyExcelUtil导出数据

String downLoadFileName = EasyExcelUtil.writeSingleExcel("服务人员导出", "服务人员导出", poList, WorkerInfoPO.class);
return ResultBody.ok(downLoadFileName);

1.1.5 总体示例

@ApiOperation(value = "服务人员导出", notes = "服务人员导出")
@PostMapping(value = "/exportWorkerInfoExcel")
public ResultBody<String> exportWorkerInfoExcel(@RequestBody WorkerInfoPageDto query) throws IOException {
   // ResultBody<Page<KamaitachiWorkerInfoDTO>> iPageResultBody = this.list(query);
    ResultBody<Page<KamaitachiWorkerInfoDTO>> iPageResultBody = this.list(query);
    List<Object> poList = iPageResultBody.getData().getRecords().stream()
            .map(kamaitachiWorkerInfoDTO -> {
                WorkerInfoPO workerInfoPO = new WorkerInfoPO();
                BeanUtils.copyProperties(kamaitachiWorkerInfoDTO,workerInfoPO);
​
                //拥有证件
                List<KamaitachiWorkerFiles> personalCardFilesList = kamaitachiWorkerInfoDTO.getPersonalCardFilesList();
                if(personalCardFilesList != null && personalCardFilesList.size()>0){
                    StringBuilder sbWorkerFiles = new StringBuilder();
                    for (KamaitachiWorkerFiles kamaitachiWorkerFiles : personalCardFilesList) {
                        if(StringUtil.isNotEmpty(kamaitachiWorkerFiles.getFileUrl())){
                            sbWorkerFiles.append(kamaitachiWorkerFiles.getCredentialsName()).append('、');
                        }
                    }
                    workerInfoPO.setPersonalCardFiles(sbWorkerFiles.toString());
                }
                //性别
                workerInfoPO.setSex(SexEnum.getSexName(kamaitachiWorkerInfoDTO.getSex()));
                //实名认证
                workerInfoPO.setIsRealname(RealnameStatusEnum.getName(kamaitachiWorkerInfoDTO.getIsRealname()));
                //利用字典转换学历,须+1
                Integer highestEducationCode = kamaitachiWorkerInfoDTO.getHighestEducationCode();
               /* Map<String, String> highestEducationMap = sysdictUtil.getSysdict("KAMA_EDUCATION_REQUIRE","")
                        .entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));*/
                if(highestEducationCode != null && highestEducationCode >0){
                    if(StringUtil.isNotEmpty(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1))){
                        workerInfoPO.setHighestEducationName(SysDictParseUtil.parseSingleDictValue("KAMA_EDUCATION_REQUIRE",highestEducationCode+1));
                    }else{
                        workerInfoPO.setHighestEducationName("");
                    }
                }
                return workerInfoPO;
            })
            .collect(Collectors.toList());
    String downLoadFileName = EasyExcelUtil.writeSingleExcel("服务人员导出", "服务人员导出", poList, WorkerInfoPO.class);
    return ResultBody.ok(downLoadFileName);
}

### EasyExcelUtil 使用指南 #### 简介 `EasyExcelUtil` 是基于阿里巴巴开源项目 `EasyExcel` 的封装工具类,旨在简化 Java 应用程序中的 Excel 文件读写操作。通过该工具类可以更便捷地处理大量数据而不会占用过多内存资源[^1]。 #### 主要功能特性 - 支持大文件快速导出; - 提供简单易用的 API 接口; - 可自定义样式模板; - 实现监听器模式优化性能; #### 基本依赖引入 为了使用此工具,在 Maven 项目的 pom.xml 中添加如下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>最新版本号</version> </dependency> ``` 请注意替换为实际所需的版本号[^2]。 #### 数据模型定义 当准备将对象列表写出到 Excel 表格时,通常先创建对应的实体类并标注字段映射关系: ```java public class DemoData { @ExcelProperty("字符串标题") private String string; @ExcelProperty("日期标题") private Date date; // getter 和 setter 方法... } ``` 上述代码片段展示了如何利用注解来指定列名以及对应的数据类型转换逻辑[^3]。 #### 导入/导出示例 下面给出一段简单的例子说明怎样调用 `EasyExcelUtil` 来完成基本的任务: ##### 写入数据至 Excel 文件 ```java // 准备一些测试数据 List<DemoData> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { DemoData data = new DemoData(); data.setString("字符串" + i); data.setDate(new Date()); list.add(data); } // 调用静态方法 write() 进行保存 String fileName = "D:/demo.xlsx"; EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list); ``` 这段代码实现了向本地磁盘路径下的 demo.xlsx 文件内追加记录的功能[^4]。 ##### 从 Excel 文件读取数据 ```java // 定义解析后的回调处理器 class PageReadListener extends AnalysisEventListener<DemoData> { public void invoke(DemoData data, AnalysisContext context) { System.out.println("解析到一条数据:" + data.getString()); } public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("所有数据解析完成!"); } } // 执行读取过程 String filePath = "D:/demo.xlsx"; EasyExcel.read(filePath, DemoData.class, new PageReadListener()).sheet().doRead(); ``` 这里展示了一个典型的场景——遍历整个工作表并将每一行的内容打印出来[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

饼干大怪兽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值