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

news/2024/7/21 5:21:31 标签: 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。


http://www.niftyadmin.cn/n/5342777.html

相关文章

Git--基本操作介绍(2)

Git 常用的是以下 6 个命令&#xff1a;git clone、git push、git add 、git commit、git checkout、git pull. 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xf…

php中laravel项目开发技巧与避坑

公司开发新业务&#xff0c;涉及到地址引用和循环遍历&#xff0c;结果测试人员说部分数据对不上&#xff0c;经排查&#xff0c;ID无值&#xff0c;name却有值&#xff0c;断点定位后&#xff0c;发现是地址引用的问题引起的 问题原因 数据库查询也确实是0 解决方案 注意事项…

Oracle连载3----共享池的内部结构及优化处理

是SGA的一个组件,共享池是为了让我们大家共享数据而设置的缓冲池。共享池的内存是通过Oracle 通用内存管理来进行管理。KGH heap Manager 所有共享池的free内存都被挂在成为freelists的空闲链表上,链表是按照bucket机制建立,更具空闲内存片段大小,挂在了不同的bucket上。 …

ES6笔记-symbol

ES6 symbol 是什么 ES5的对象属性名是字符串&#xff0c;这容易造成属性名的冲突。symbol是一种机制&#xff0c;保证每个属性的名字都是独一无二的。这样就从根本上防止属性名冲突。 它是一种原始数据类型Symbol,表示独一无二的值。它属于javaScript语言的原生数据类型之一。…

21.云原生之GitLab pipline语法(CI基础)

云原生专栏大纲 文章目录 gitlab-ci.yml 介绍GitLab中语法检测gitlab-ci.yml 语法job定义作业before_script和after_scriptstages定义阶段tages指定runnerallow_failure运行失败when控制作业运行retry重试timeout超时parallel并行作业only & exceptrulescache 缓存cache:p…

美易官方:小米汽车交付时间传闻被官方辟谣

在科技与互联网的快速发展浪潮中&#xff0c;各类信息传播速度之快令人咋舌。然而&#xff0c;信息的真实性却时常成为公众关注的焦点。近日&#xff0c;关于小米汽车交付时间的谣言再次引起市场的广泛关注。小米公司发言人迅速作出回应&#xff0c;明确指出这些关于小米汽车交…

微信小程序(十二)在线图标与字体的获取与引入

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.从IconFont获取图标与文字的样式链接 2.将在线图标配置进页面中&#xff08;源码&#xff09; 3.将字体配置进页面文字中&#xff08;源码&#xff09; 4.css样式的多文件导入 获取链接 1.获取图标链接 登入…

编程笔记 html5cssjs 049 CSS列表

编程笔记 html5&css&js 049 CSS列表 一、CSS列表二、HTML 列表和 CSS 列表属性三、定位列表项标记四、列表 - 简写属性五、设置列表的颜色样式六、练习小结 CSS设置列表样式。 一、CSS列表 <!DOCTYPE html> <html> <head> <style> ul.a {list…