融资项目——EasyExcel将Excel文件保存至数据库

        上一篇博客已经基本介绍了EasyExcel的配置与基本使用方法。现在准备使用EasyExcel将Excel文件保存至数据库。

1.由于我们想每读取Excel中的N条记录后将这些记录全部写入数据库中。所以首先我们在Mybatis文件内先要写一个批量保存Excel文件中的记录的sql语句。

    <insert id="insertBatch">
        insert into dict (
        id ,
        parent_id ,
        name ,
        value ,
        dict_code
        ) values
        <foreach collection="list" item="item" index="index" separator=",">
            (
            #{item.id} ,
            #{item.parentId} ,
            #{item.name} ,
            #{item.value} ,
            #{item.dictCode}
            )
        </foreach>
    </insert>

随后在Mapper接口中定义insertBatch方法。

public interface DictMapper extends BaseMapper<Dict> {

    void insertBatch(List<ExcelDictDTO> list);

}

2. 首先创建相应的实体类(对应Excel表中一个记录)的监听器。

@Slf4j
public class ExcelDictDTOListener extends AnalysisEventListener<ExcelDictDTO> {
    private List<ExcelDictDTO> excelDictDTOList=new ArrayList<>();

    private static final int BATCH_COUNT=10;
    private DictMapper dictMapper;
    //传入mapper对象
    public ExcelDictDTOListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }

    @Override
    public void invoke(ExcelDictDTO excelDictDTO, AnalysisContext analysisContext) {
        log.info("data:{}",excelDictDTO);
        excelDictDTOList.add(excelDictDTO);
        if(excelDictDTOList.size()>=BATCH_COUNT){
            saveData();
            excelDictDTOList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 不足BATCH_COUNT数的记录在这里存储
        if(excelDictDTOList.size()>0)saveData();
        log.info("所有数据解析完成!");
    }
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", excelDictDTOList.size());
        // 批量插入
        dictMapper.insertBatch(excelDictDTOList);
        log.info("存储数据库成功!");
    }
}

3.创建相关的服务类,读取Excel数据流的内容。

@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
    @Transactional
    @Override
    public void importDictDataByExcel(InputStream inputStream){
        EasyExcel.read(inputStream, ExcelDictDTO.class,new ExcelDictDTOListener(dictMapper)).sheet().doRead();
    }


}

4.创建相关Controller,通过getInputStream方法获取excel文件的数据流。

@Api("数据字典的管理")
@RestController
@RequestMapping("/admin/core/dict")
@Slf4j
@CrossOrigin
public class AdminDictController {
    @Autowired
    private DictService dictService;

    @ApiOperation("导入Excel表")
    @PostMapping("/import")
    public R importExcel(@RequestParam("file")MultipartFile file){
        try {
            InputStream inputStream=file.getInputStream();
            dictService.importDictDataByExcel(inputStream);
            return R.ok().message("导入成功");
        }catch (Exception e){
            throw new BusinessException(ResponseEnum.UPLOAD_ERROR,e);
        }

    }
}

在编写代码时,逻辑顺序为步骤1-2-3-4,但在实际调用时逻辑顺序为步骤4-3-2-1。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用EasyExcel提供的读取Excel文件数据的功能,将数据读取到Java程序中,然后再使用JDBC将数据插入到数据库中。 以下是一个示例代码,演示如何使用EasyExcelExcel文件中的数据导入到MySQL数据库中: ```java // 读取Excel文件数据 String fileName = "example.xlsx"; List<DemoData> dataList = new ArrayList<>(); EasyExcel.read(fileName, DemoData.class, new DemoDataListener(dataList)).sheet().doRead(); // 将数据插入到数据库 String url = "jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; String username = "root"; String password = "password"; String sql = "INSERT INTO demo_data (id, name, age) VALUES (?, ?, ?)"; try (Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement(sql)) { for (DemoData data : dataList) { pstmt.setInt(1, data.getId()); pstmt.setString(2, data.getName()); pstmt.setInt(3, data.getAge()); pstmt.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } ``` 其中,`DemoData`是一个Java类,用于存储Excel文件中的数据。`DemoDataListener`是一个实现了EasyExcel监听器接口的类,用于处理读取Excel文件时的事件。在`DemoDataListener`的`invoke`方法中,将读取到的数据存储到`dataList`中。 在上述代码中,使用JDBC连接MySQL数据库,并将数据插入到`demo_data`表中。你需要根据自己的实际情况修改数据库连接信息和SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值