用easyexcel简单导入excel到数据库详细

记录个人初级工作时完整思路

1.建立数据库字段

2.建立实体类

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("info_camper_excel")
@ApiModel(value="CamperExcel对象", description="上传营员名单实体类")
public class CamperExcel extends AbstractEntity {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键")
    @TableId("id")
    private Long id;

    @ApiModelProperty(value = "业务id")
    @TableField("info_id")
    private Long infoId;

    @ApiModelProperty(value = "序号")
    @TableField("serial_no")
    private Long serialNo;


    @ApiModelProperty(value = "姓名")
    @TableField("name")
    private String name;

    @ApiModelProperty(value = "国籍")
    @TableField("nationality")
    private String nationality;

    @ApiModelProperty(value = "性别")
    @TableField("gender")
    private Boolean gender;

    @ApiModelProperty(value = "年龄")
    @TableField("age")
    private Integer age;

    @ApiModelProperty(value = "汉语桥网站注册邮箱")
    @TableField("email")
    private String email;

    @ApiModelProperty(value = "是否孔院学员")
    @TableField("is_ky")
    private Boolean isKy;

    @ApiModelProperty(value = "护照号或本国ID号")
    @TableField("passport_no")
    private Long passportNo;


    @ApiModelProperty(value = "创建时间")
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;

}

 3.建立dto实体类

@Data
@ApiModel(value="CamperExcel对象", description="上传营员名单实体类")
public class CamperExcelDTO implements Serializable  {
    private static final long serialVersionUID = 1L;


    @ApiModelProperty(value = "序号")
    @ExcelProperty(value = "序号",index = 0)
    private Long serialNo;

    @ApiModelProperty(value = "姓名")
    @ExcelProperty(value = "姓名",index = 1)
    private String name;

    @ApiModelProperty(value = "性别")
    @ExcelProperty(value = "性别", index = 2,converter = GenderConverter.class)
    private Boolean gender;

    @ApiModelProperty(value = "年龄")
    @ExcelProperty(value = "年龄",index = 3)
    private Integer age;

    @ApiModelProperty(value = "国籍")
    @ExcelProperty(value = "国籍",index = 4)
    private String nationality;

    @ApiModelProperty(value = "汉语桥网站注册邮箱")
    @ExcelProperty(value = "汉语桥网站注册邮箱",index = 5)
    private String email;


    @ApiModelProperty(value = "护照号或本国ID号")
    @ExcelProperty(value = "护照号或本国ID号",index = 6)
    private Long passportNo;


    @ApiModelProperty(value = "是否孔院学员")
    @ExcelProperty(value = "是否孔院学员",index = 7,converter = IsKyConverter.class)
    private Boolean isKy;



    public CamperExcel convertEntity() {
        CamperExcel entity = new CamperExcel();
        BeanUtils.copyProperties(this, entity);
        return entity;
    }

    public CamperExcelDTO convertVO(CamperExcel entity) {
        BeanUtils.copyProperties(entity, this);
        return this;
    }

}

4.建立前后端交互VO对象

@Data
@Accessors(chain = true)
@ApiModel(value = "CamperExcelVO对象", description = "上传营员名单VO")
@AllArgsConstructor
@NoArgsConstructor
public class CamperExcelVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "infoId")
    @NotNull(message="infoId不能为空")
    private Long infoId;


    @ApiModelProperty(value = "data")
    private List<CamperExcel> camperExcelList;

@Data
public class ResultInfo implements Serializable {
    private Integer code; //编码:200成功,500和其它数字为失败
    private String msg; //错误信息
    private Object data; //数据

    //成功结果
    public static ResultInfo success(Object object) {
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.data = object;
        resultInfo.code = 200;
        return resultInfo;
    }

    //失败结果
    public static ResultInfo error(String msg) {
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.msg = msg;
        resultInfo.code = 500;
        return resultInfo;
    }
}

5.easyExcel监听器

@Slf4j
@Component
public class ExcelListener extends AnalysisEventListener<CamperExcelDTO> {

    public static Long infoId = 0L;

    @Autowired
    private CamperExcelService camperExcelService;

    //删除记录数
    private Integer count  = 0;

    //批量保存
    private List<CamperExcel> camperExcelList = new ArrayList<>();

    @Override
    public void invoke(CamperExcelDTO data, AnalysisContext context) {
        // 每读到一条记录,执行这个方法
        log.info("读取到一条数据{}", JSON.toJSONString(data));

        CamperExcel camperExcel = data.convertEntity();
        camperExcel.setInfoId(infoId);
        // 更新数据到数据库中 单个数据存储
        // camperExcelService.save(camperExcel);

        //放到集合里,进行批量存储
        camperExcelList.add(camperExcel);
    }

    //批量插入
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 读完所有记录后执行这个方法
        log.info("数据读取完成");
        // 这里保存数据,数据存储到数据库
        saveData();

        log.info("所有数据解析完成!");

        //清空list集合
        camperExcelList.clear();

        log.info("删除{}条旧数据",count);
    }

    private void saveData() {
        log.info("{}条数据,开始存储数据库!", camperExcelList.size());

        count = camperExcelService.deleteByInfoId(infoId);

        camperExcelService.saveBatch(camperExcelList);

        log.info("存储数据库成功!");
    }
}

6.Boolean字段前后端转换器

//性别excel和java实体类转换器
public class GenderConverter implements Converter<Boolean> {
    @Override
    public Class supportJavaTypeKey() {
        return Boolean.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Boolean convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return "男".equals(cellData.getStringValue()) ? true : false;
    }

    @Override
    public CellData convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return new CellData(value.equals(true) ? "男" : "女");
    }
}
//是否孔院excel和java实体类转换器
public class IsKyConverter implements Converter<Boolean> {
    @Override
    public Class supportJavaTypeKey() {
        return Boolean.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Boolean convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return "是".equals(cellData.getStringValue()) ? true : false;
    }

    @Override
    public CellData convertToExcelData(Boolean value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return new CellData(value.equals(true) ? "是" : "否");
    }
}

7.controller层

@Api(tags = "上传营员名单Excel")
@ResponseResult
@RestController
@RequestMapping("/camperExcel")
public class CamperExcelController {
    @Autowired
    private ExcelListener excelListener;


    @GetMapping("/templateDownLoad")
    public void templateDownLoad(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //下载excel的响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        //读取模板文件,写入到文件中
        String realPath = request.getServletContext().getRealPath("/template/营员名单模板.xlsx");
        File file = new File(realPath);
        byte[] bytes = FileUtils.readFileToByteArray(file);
        //下载文件名是中文,转码,不然会出现乱码
        String fileName = URLEncoder.encode("营员名单模板", "utf-8");
        //告诉浏览器下载文件名
        response.addHeader("Content-Disposition", "attachment;filename="+fileName + ".xlsx");
        // 得到指向浏览器的输出流,向浏览器输出
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(bytes);
        outputStream.close();
    }


    @PostMapping("/import/{infoId}")
    public ResultInfo importExcel(@RequestBody MultipartFile file,@PathVariable Long infoId) throws Exception {
        //避免预检请求报错
        if (file != null) {
            /*
            * 参数1:文件流
            * 参数2: 读取数据封装
            * 参数3: 监听器,每读取一行数据,会调用监听器的invoke方法*/
            ExcelListener.infoId = infoId;
            ExcelReaderBuilder read = EasyExcel.read(file.getInputStream(), CamperExcelDTO.class, excelListener);
            ExcelReaderSheetBuilder sheet = read.sheet();
            sheet.doRead();
            return ResultInfo.success("数据存储完成...");
        }
        return ResultInfo.error("服务器内部异常,请稍后再次尝试...");
    }
}

8.service 和 实现类

public interface CamperExcelService extends MyDoipBaseService<CamperExcel> {
    
    Integer deleteByInfoId(Long infoId)throws BusinessException;

    
    void save(CamperExcelDTO entity)throws BusinessException;

    
    Boolean saveBatch(CamperExcelVO vo) throws BusinessException;
    
}
@Service
@Transactional
public class CamperExcelImpl extends MyDoipBaseServiceImpl<CamperExcelMapper, CamperExcel> implements CamperExcelService {


    @Override
    public Integer deleteByInfoId(Long infoId) throws BusinessException {
        int delete = baseMapper.delete(Wrappers.<CamperExcel>lambdaQuery().eq(CamperExcel::getInfoId, infoId));
        return Integer.valueOf(delete);
    }

    @Override
    public void save(CamperExcelDTO entity) throws BusinessException {
        CamperExcel camperExcel = entity.convertEntity();
        baseMapper.insert(camperExcel);
    }

    @Override
    public Boolean saveBatch(CamperExcelVO vo) throws BusinessException {
        baseMapper.delete(Wrappers.<CamperExcel>lambdaQuery().eq(CamperExcel::getInfoId, vo.getInfoId()));
        this.saveBatch(vo.getCamperExcelList());
        return null;
    }
}

9.mappper

@Repository
public interface CamperExcelMapper extends MyDoipBaseMapper<CamperExcel> {
}

10.模板存储位置

11.模板样式

12.数据库存储效果

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个比较常见的需求,我可以给你提供一个简单的实现思路。 1. 首先,我们需要在项目中引入 easyExcel 和 mybatis-plus 的依赖。你可以在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> ``` 2. 然后,我们需要定义一个实体类,用于映射 Excel 中的数据。假设我们要导入的是学生信息,我们可以定义一个 Student 类,如下所示: ```java @Data public class Student { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; @ExcelProperty("性别") private String gender; @ExcelProperty("班级") private String className; } ``` 3. 接下来,我们需要定义一个 Controller,用于接收上传的 Excel 文件,并将数据批量插入到数据库中。代码如下: ```java @RestController @RequestMapping("/import") public class ImportController { @Autowired private StudentService studentService; @PostMapping("/excel") public String importExcel(MultipartFile file) throws Exception { EasyExcel.read(file.getInputStream(), Student.class, new StudentListener(studentService)).sheet().doRead(); return "导入成功"; } } ``` 4. 在上面的代码中,我们使用了 EasyExcel 提供的 read 方法,将 Excel 文件转换为 Student 类型的数据。同时,我们还定义了一个 StudentListener 类,用于处理读取到的每一行数据。代码如下: ```java public class StudentListener extends AnalysisEventListener<Student> { private List<Student> list = new ArrayList<>(); private StudentService studentService; public StudentListener(StudentService studentService) { this.studentService = studentService; } @Override public void invoke(Student student, AnalysisContext analysisContext) { list.add(student); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { studentService.saveBatch(list); } } ``` 5. 最后,我们需要在 StudentService 类中添加一个 saveBatch 方法,用于批量插入数据。代码如下: ```java @Service public class StudentService extends ServiceImpl<StudentMapper, Student> { public void saveBatch(List<Student> students) { saveBatch(students, 100); } } ``` 这样,我们就完成了使用 SpringBoot+Mybatis-plus+easyExcel 实现批量导入 Excel数据库的功能。当然,还有很多细节需要处理,比如 Excel 中的日期等格式问题,你可以根据实际需求进行适当的修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值