SpringBoot中使用easyExcel读取excel文件到数据库中

1、数据库中表的结构如下
在这里插入图片描述
2、excel中的数据如下
在这里插入图片描述
3、定义一个与excel表中对应的实体类

@Data
public class SubjectData {
   
   

    @ExcelProperty(index = 0)
    private String oneSubjectName;

    @ExcelProperty(index = 1)
    private String twoSubjectName;
}

4、controller

@RestController
public class EduSubjectController {
   
   

    @Autowired
    EduSubjectService eduSubjectService;

//  获取上传的Excel文件,从文件中读取数据保存到数据库中
    @PostMapping("addSubject")
    public R addSubject(MultipartFile file){
   
   
        eduSubjectService.addSubject(file,eduSubjectService);
        return R.ok();
    }

}

5、service

@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements EduSubjectService {
   
   
<think>好的,我现在需要帮助用户在Spring Boot项目中使用EasyExcel将数据读取并存入不同的数据库表。用户之前的问题是关于如何实现这一点,我需要参考提供的引用信息来构建答案。 首先,我得回顾一下用户提供的引用内容。引用1、2、3都提到了导入EasyExcel依赖,创建实体类映射Excel数据,以及使用监听器处理读取的数据。引用4提到了在Controller中使用Transactional注解和读取文件的示例代码,还涉及到将数据存储到数据库的不同表。 用户的需求是将数据存入不同的数据库表,这意味着可能需要处理多个实体类,或者根据某些条件将数据分发到不同的表。我需要考虑如何在一个Excel文件中处理不同结构的数据,或者如何将同一份数据拆分到不同的表中。 接下来,我应该分步骤来解答这个问题: 1. **依赖导入**:所有引用都提到需要添加EasyExcel依赖,但版本不同。用户需要选择合适版本,比如较新的3.0.5或2.2.3。需要注意版本兼容性,特别是与Spring Boot的版本是否冲突。 2. **实体类设计**:根据引用2和3,每个实体类需要使用@ExcelProperty注解来映射Excel列。如果要存入不同的表,可能需要多个实体类,每个对应一个表的结构。例如,Excel中的不同sheet或不同区域对应不同的实体。 3. **监听器实现**:引用2和3中提到创建监听器,在读取数据时逐行处理。对于多表的情况,可能需要多个监听器,或者在单个监听器中根据条件判断数据该存入哪个表。或者,可以在监听器中调用不同的Service层方法插入不同的表。 4. **事务管理**:引用4使用了@Transactional注解来确保事务的一致性。当涉及多表插入时,可能需要事务管理来保证数据的一致性,尤其是在出现异常时回滚所有操作。 5. **Service层处理**:每个实体类可能需要对应的Service和Mapper(如MyBatis的Mapper或JPA的Repository)来执行数据库操作。监听器中需要注入这些Service,但需要注意监听器的生命周期和Spring容器的管理,避免注入问题。 可能的挑战: - **监听器中注入Service的问题**:因为监听器通常由EasyExcel通过反射创建,不在Spring容器管理下,导致无法直接注入Service。解决方法如引用4提到的,通过构造方法传递Service实例。 - **多表数据关联**:如果不同表之间有外键关联,需要在插入数据时处理先后顺序,比如先插入主表,再插入从表。 - **大数据量处理**:使用EasyExcel的异步读取和分批次插入,避免内存溢出。 需要验证的步骤: - 如何在一个Excel文件读取不同结构的数据? - 如何在监听器中区分不同的数据并存入不同的表? - 如何处理事务,确保多表插入的原子性? 可能的解决方案是,为每个表设计对应的实体类和监听器,或者在同一个监听器中根据业务逻辑判断数据归属,并调用相应的Service方法。此外,可能需要使用数据库事务来保证多个插入操作的一致性。 最后,需要总结步骤,并生成相关问题,如优化方法、事务处理、多Sheet处理等。</think>在Spring Boot使用EasyExcel实现多表存储需按以下步骤操作: ### 一、环境准备 1. 添加EasyExcel依赖(建议使用3.x版本) ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency> ``` ### 二、实体类设计 ```java // 表1实体 @Data public class Order { @ExcelProperty("订单编号") private String orderNo; @ExcelProperty("金额") private BigDecimal amount; } // 表2实体 @Data public class User { @ExcelProperty("用户ID") private Long userId; @ExcelProperty("用户名") private String name; } ``` ### 三、编写监听器 ```java public class MultiTableListener extends AnalysisEventListener<Map<Integer, String>> { private final OrderService orderService; private final UserService userService; // 通过构造器注入服务 public MultiTableListener(OrderService orderService, UserService userService) { this.orderService = orderService; this.userService = userService; } @Override public void invoke(Map<Integer, String> dataMap, AnalysisContext context) { // 根据列索引判断数据类型 if (dataMap.containsKey(0) && dataMap.get(0).startsWith("ORD")) { Order order = new Order(); order.setOrderNo(dataMap.get(0)); order.setAmount(new BigDecimal(dataMap.get(1))); orderService.save(order); } else if (dataMap.containsKey(0) && dataMap.get(0).startsWith("USR")) { User user = new User(); user.setUserId(Long.parseLong(dataMap.get(0).substring(3))); user.setName(dataMap.get(1)); userService.save(user); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 可在此处执行批量插入操作 } } ``` ### 四、Controller实现 ```java @PostMapping("/import") @Transactional(rollbackFor = Exception.class) public ResponseEntity<String> importExcel(@RequestParam("file") MultipartFile file) { EasyExcel.read(file.getInputStream(), new MultiTableListener(orderService, userService)) .sheet() .doRead(); return ResponseEntity.ok("导入成功"); } ``` ### 五、关键配置 1. 在监听器中通过`@Lazy`解决循环依赖: ```java @Bean public MultiTableListener multiTableListener( @Lazy OrderService orderService, @Lazy UserService userService) { return new MultiTableListener(orderService, userService); } ``` 2. 使用`@Transactional`保证多表操作事务性 ### 六、性能优化建议 1. 批量插入:每积累1000条数据执行一次批量插入 2. 异步处理:使用`@Async`注解实现异步数据写入 3. 内存控制:配置`ReadCacheSize`参数(默认3000条) ```java EasyExcel.read() .readCacheSize(5000) // 设置缓存大小 .sheet() .doRead(); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值