(一)EasyExcel的使用(读取数据到实体类即绑定实体类)

        最近遇到了一个excel简单的导入导出的需求,因此就对easyexcel第三方插件的使用做一点总结,大家可以看一看,可能会对你有点帮助。

目录

前言:

1、引入easyexcel相关依赖

2、创建对应excel的实体类

3、导入excel,并保存到数据库表中

4、导入excel的服务操作

5、得到结果,保存数据到数据库

6、读取数据库数据写入excel

7、总结


前言:

        项目是一个springboot 项目,使用maven对依赖进行管理,需求有两个是:

        ①导入的excel有模板,即表头是明确的(简单)

        ②导入的excel没有模板,即表头是不明确的

        此篇博客主要讲述easyexcel对于需求①的开发,关于需求②会在下一篇博客中进行讲解,地址(二)easyexcel 的使用(读取数据到map集合中)_网恋褙骗八万的博客-CSDN博客

1、引入easyexcel相关依赖

<!--   easyexcel     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>

2、创建对应excel的实体类

        excel模板如下:

         对应的实体类:(注解 @ExcelProperty是easyexcel自带的注解,可以通过value绑定值即绑定到表头的方式,让每个属性对应到表头,当然也可以使用index进行索引的绑定。)

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.ToString;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/11/4 19:01
 * @Description:
 */
@Data
@ToString
public class FaultInfoData {

    @ExcelProperty(value = "产品专业")
    private String productSpeacialty;

    @ExcelProperty(value = "产品类别")
    private String productCategory;

    @ExcelProperty(value = "产品规格")
    private String productSpecification;

    @ExcelProperty(value = "故障时间")
    private String faultTimeString;

    @ExcelProperty(value = "故障型号")
    private String faultModel;

    @ExcelProperty(value = "故障原因")
    private String faultReason;

    @ExcelProperty(value = "解决方案")
    private String faultSolution;

}

3、导入excel,并保存到数据库表中


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.bjsasc.productksys.exceptionHandler.SelfDefinitionException;
import com.bjsasc.productksys.faultinfoservice.entity.FaultInfo;
import com.bjsasc.productksys.faultinfoservice.entity.excel.FaultInfoData;
import com.bjsasc.productksys.faultinfoservice.service.FaultInfoService;
import com.bjsasc.productksys.utils.StringToDateUtil;
import org.springframework.beans.BeanUtils;


import java.util.Date;
import java.util.Map;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/11/4 19:20
 * @Description:
 */
public class FaultExcelListener extends AnalysisEventListener<FaultInfoData> {

    private FaultInfoService faultInfoService;
    private int treeNodeId;

    public FaultExcelListener(FaultInfoService faultInfoService) {
        this.faultInfoService = faultInfoService;
    }

    public FaultExcelListener() {
    }

    public FaultExcelListener(FaultInfoService faultInfoService, int treeNodeId) {
        this.faultInfoService = faultInfoService;
        this.treeNodeId = treeNodeId;
    }

    //一行一行读取,然后使用new FaultInfo,把faultInfoData 使用copy的一个工具类复制过去,然后使用service直接save函数进行保存到数据库
    @Override
    public void invoke(FaultInfoData faultInfoData, AnalysisContext analysisContext) {
        //表示excel中没有数据,就不需要读取了
        if (faultInfoData == null) {
            throw new SelfDefinitionException(20001, "故障信息导入失败!");
        }
//        System.out.println(faultInfoData);
        //用于临时的一个对象,保存到数据库中的实例
        FaultInfo faultInfo = new FaultInfo();
        //使用工具类将FaultInfoData类拷贝给FaultInfo类
        BeanUtils.copyProperties(faultInfoData, faultInfo);  //这儿是将faultInfoData拷贝到faultInfo
        //设置树的节点,此时的树节点应该为前端传递过来的树节点id
        faultInfo.setSysTreeId(treeNodeId);
        faultInfoService.save(faultInfo);
    }

    //读取excel表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext
            context) {
        System.out.println("表头信息:" + headMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("表格读取完成!");
    }

}

对以上代码进行解读,其中

  1. invoke()函数是进行一行行读取excel数据的函数,并且每行数据会被保存到 FaultInfoData 类中,然后将FaultInfoData转化成数据库对应的实体类 FaultInfo ,使用mybatis进行保存数据。  
  2. invokeHeadMap()函数能够打印输出表头
  3. doAfterAllAnalysed()函数是表格读取后进行的操作
  4.  FaultInfoService是进行服务操作的,由于没有在spring容器中进行注册,所以要通过传递参数的形式传递过来。

4、导入excel的服务操作

 @Override
    public void saveFaultInfos(MultipartFile file, FaultInfoService faultInfoService, int treeNodeId) {
        try {
            //文件输入流
            InputStream is = file.getInputStream();
            //调用方法进行读取
            EasyExcel.read(is, FaultInfoData.class, new FaultExcelListener(faultInfoService, treeNodeId)).sheet().doRead();
        } catch (Exception e) {
            e.printStackTrace();
            throw new SelfDefinitionException(20001, "导入故障信息excel失败,添加失败");
        }
    }

5、得到结果,保存数据到数据库

        访问controller的链接地址,进行服务调用,将数据保存到数据库,数据库表结果如下图:

以上是读取excel保存到数据库的操作

6、读取数据库数据写入excel

 @ApiOperation(value = "选择一个路径,将当前的列表导出到excel")
    @GetMapping("/xxxxx/{treeNodeId}")
    public R xxxxx(@ApiParam(name = "treeNodeId", value = "当前树节点id", required = true) @PathVariable Integer treeNodeId) {
        SysTree treeNode = sysTreeService.getById(treeNodeId);
        String treeNodeName = treeNode.getNodeName();
        String fileName = treeNodeName + "_故障信息.xlsx";
        List<FaultInfo> list = faultInfoService.list(new QueryWrapper<FaultInfo>().eq("sys_tree_id", treeNodeId));

        //将FaultInfo类型转化成FaultInfoData类型
        List<FaultInfoData> faultInfoDataList = list.stream().map(info -> {
            FaultInfoData faultInfoData = new FaultInfoData();
            BeanUtils.copyProperties(info, faultInfoData);
            return faultInfoData;
        }).collect(Collectors.toList());

        EasyExcel.write(fileName, FaultInfoData.class).sheet(treeNodeName).doWrite(faultInfoDataList);
        return R.ok();
    }

7、总结

        以上就是使用第三方插件easyexcel读取excel,写入excel的过程,本来想的挺清晰的,结果写着写着就有点乱了,不知道你们能不能看懂,通过绑定实体类的方式读取写入操作是比较简单的,仔细看看应该能够读懂,嘻嘻嘻!

学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
                                                                                                         ------不写代码不会凸的小刘

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用阿里巴巴的 EasyExcel 库来读取 Excel 并将其转换为实体类对象,同时还可以对字段进行校验。 以下是一个简单的示例代码: ```java // 定义实体类 public class User { @NotEmpty(message = "姓名不能为空") private String name; @NotNull(message = "年龄不能为空") @Min(value = 18, message = "年龄必须大于等于18岁") private Integer age; @Email(message = "邮箱格式不正确") private String email; // 省略 getter 和 setter 方法 } // 读取 Excel 并转换为实体类并校验字段 public List<User> readExcel(File file) throws Exception { List<User> userList = new ArrayList<>(); ExcelReader reader = EasyExcel.read(file).build(); try { Sheet sheet = reader.getSheets().get(0); // 定义读取监听器 reader.read(sheet.getSheetNo()).head(User.class).registerReadListener(new AnalysisEventListener<User>() { @Override public void invoke(User user, AnalysisContext analysisContext) { // 校验字段 Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<User>> violations = validator.validate(user); if (!violations.isEmpty()) { throw new RuntimeException(violations.iterator().next().getMessage()); } userList.add(user); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { // 读取完成后的操作 } }).sheet().doRead(); } finally { reader.finish(); } return userList; } ``` 在上述代码中,我们首先定义了一个 `User` 实体类,并且在字段上使用了校验注解。然后使用 EasyExcel 库读取 Excel 文件,并在读取监听器中将每行数据转换为 `User` 对象,并对其进行字段校验。如果校验不通过,则直接抛出异常。最后将转换后的 `User` 对象加入到 `userList` 中并返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值