EasyExcel实现⭐️本地excel数据解析并保存到数据库的脚本编写,附案例实现

目录

前言

一、 EasyExcel 简介 

二、实战分析

1.Controller控制层

2. service方法和方法实现

3.EasyExcel相关类

        3.1 excel表实体类

        3.2 自定义监听器类

4.测试

        4.1 准备工作

        4.2 断点调试

5.生成脚本文件

 三、分析总结

章末


        小伙伴们大家好,最近开发的时候遇到了大量数据处理问题,今天来分析是如何通过EasyExcel工具实现批量数据导入解放双手的

前言

        项目系统中需要新增一个“繁体中文”初始化翻译功能(系统初始化有中英两个语种),拿到产品给的翻译好的数据后,简单看了下共1800多条数据,需要做的就是将这些数据按照sql插入语句的格式编写好,跑一下脚本即可(类似insert into table value (...);),但是这么多数据一条一条手写指定是要写废了的

        天无绝人之路,前几天在地铁上闲来无事翻到的excel数据读取工具这不就来活了嘛,先将表格数据读取解析,然后通过代码插入到数据库中,再用数据库的导出工具生成插入语句,岂不美哉,

        说干就干,IDEA 启动

一、 EasyExcel 简介 

        EasyExcel 是一款基于 Java 的开源 Excel 处理工具,它提供了简单且高效的方式来读取、写入和操作 Excel 文件。EasyExcel 是阿里巴巴集团开发并维护的项目,旨在解决大数据量 Excel 文件处理的难题。

以下是 EasyExcel 工具的一些特点和功能:

  1. 读取和写入 Excel 文件:EasyExcel 提供了简单易用的 API,可以方便地读取和写入 Excel 文件,支持常见的 Excel 格式,如 .xls 和 .xlsx。

  2. 高性能处理:EasyExcel 使用内存友好的方式处理 Excel 文件,能够快速处理大量的数据,具备较高的性能。

  3. 简化的数据模型:EasyExcel 采用简化的数据模型,使得读取和写入 Excel 数据更加灵活和方便。您可以将 Excel 文件的数据映射到 Java 对象或者直接处理 Excel 单元格数据。

  4. 复杂数据操作:EasyExcel 提供了丰富的 API,支持合并单元格、填充样式、设置数据校验等复杂的 Excel 操作。

  5. 监听器机制:EasyExcel 提供了监听器机制,您可以注册监听器来处理读取和写入 Excel 文件过程中的事件,如读取完成、写入成功等。

  6. 配置灵活:EasyExcel 支持自定义配置,您可以通过配置参数来定制读取和写入 Excel 文件的行为,如是否跳过空行、是否自动关闭流等。

二、实战分析

1.Controller控制层

        比较简单,接收一个文件参数,调用业务方法

    /**
     * 导入繁体中文
     *
     */
    @ApiOperation(value = "繁体中文落库")
    @PostMapping(value = "/importTrad")
    @HLog
    public void importTraditionInfo(@RequestParam MultipartFile file) {
        translateService.importTraditionalDataStringInfo(file);
    }
2. service方法和方法实现

        也比较简单,先判断是不是读取到了文件,然后调用EasyExcel的read方法

    /**
     * 导入翻译项数据
     *
     * @param file //忽略
     */
    void importTraditionalDataStringInfo(MultipartFile file);
@Override
    public void importTraditionalDataStringInfo(MultipartFile file) {
        if (file.isEmpty() || StringUtils.isBlank(file.getOriginalFilename())) {
            throw new MyException("文件不能为空!");
        }
        try {

    //ImportTraditionalChineseItemDto 与excel表相对应的实体类
    //TraditoonalItemListener 自定义监听器,处理逻辑在这里便补充
            EasyExcel.read(file.getInputStream(), ImportTraditionalChineseItemDto.class, new TraditoonalItemListener())
                    .sheet(0).doRead();
        } catch (IOException ex) {
            log.error("解析LocalDataStringExcel失败!");
        }
    }
3.EasyExcel相关类
        3.1 excel表实体类
@Data
public class ImportTraditionalChineseItemDto {

    @ExcelProperty(index = 0)
    @ApiModelProperty(value = "localizedId")
    private String localizedId;

    @ExcelProperty(index = 1)
    @ApiModelProperty(value = "stringId")
    private String  stringId;

    @ExcelProperty(index = 2)
    private String dataStringZh;

    @ExcelProperty(index = 3)
    @ApiModelProperty(value = "stringLanguage")
    private String stringLanguage;

    @ExcelProperty(index = 4)
    private String dataStringZhtw;


}

        3.2 自定义监听器类
@Component
@Slf4j
public class TraditoonalItemListener extends AnalysisEventListener<ImportTraditionalChineseItemDto> {

    //新建一个集合,用于存储解析的数据
    public List<ImportTraditionalChineseItemDto> translateItemLists = new ArrayList<>();


    //该方法会在doAfterAllAnalysed方法之前执行,将数据添加到集合中
    @Override
    public void invoke(ImportTraditionalChineseItemDto importTraditionalChineseItemDto, AnalysisContext analysisContext) {
        translateItemLists.add(importTraditionalChineseItemDto);
    }

    //收集好的数据具体如何处理逻辑
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    //AnalysisEventListener 不是被spring管理注入mapper,需要手动添加
        LocalizedDatastringMapper localizedDatastringMapper = SpringContextUtil.getBean("localizedDatastringMapper", LocalizedDatastringMapper.class);
        System.out.println("解析的数据" + translateItemLists);
        //筛选localizedId为空的,应该没有为空的
        List<ImportTraditionalChineseItemDto> translateItems = translateItemLists.stream()
                .filter(x -> x.getLocalizedId() != null).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(translateItems)) {
            for (ImportTraditionalChineseItemDto item : translateItems) {

                //翻译项表的实体类,用于操作数据库表
                LocalizedDatastring dataStringZhtw = new LocalizedDatastring();
                Long stringId = Long.parseLong(item.getStringId().replace(",", ""));
                dataStringZhtw.setLocalizedId(IdWorker.getId());
                dataStringZhtw.setStringId(stringId);
                dataStringZhtw.setStringLanguage("zhtw");
                dataStringZhtw.setDataString(item.getDataStringZhtw());
                dataStringZhtw.setIsActive(1);
                dataStringZhtw.setIsDelete(0);
                dataStringZhtw.setCreatedDate(new Date());
                localizedDatastringMapper.insert(dataStringZhtw);
            }
        }
        //清空
        translateItemLists.clear();
    }
}
4.测试
        4.1 准备工作

        打开apipost工具,输入请求地址,配置好文件属性,请求头的属性需要配置为这个,请求体这样配,选中需要导入的excel表格

        4.2 断点调试

        收集到的list集合大小为1842,与表格中的对比一下,去掉第一行的列名,正好1842对的上,继续往下执行,等待执行完成,看数据库表中的数据,也是对的上的

5.生成脚本文件

        右键》》生成sql》》insert》》复制即可

 三、分析总结

       除了以上这些,还有一些细节关于EasyExcel的,比如

1.这里的参数设置为0,表示从文件中的第一个表格读取,下表是从0开始的

2.也可以使用字符,使用字符则直接指定某一个表格的名称即可

3.包括实体类中的index指定下标,也可以通过赋值具体的列名实现

章末

        文章到这里就结束了 


  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现上传excel文件并将数据传输到数据库的步骤如下: 1. 前端实现文件上传功能:使用Vue.js开发前端页面,使用element-ui组件库实现文件上传组件。具体实现可以参考element-ui的文档和示例代码。 2. 后端实现文件上传功能:使用Spring Boot框架开发后端接口,使用Apache POI或者EasyExcel解析Excel文件并将数据存入数据库。具体实现可以参考Spring Boot官方文档和EasyExcel的官方文档。 3. 前后端交互:前端页面通过Ajax请求后端接口上传文件,并将文件数据以form-data格式传输到后端。后端接口接收到请求后,解析Excel文件并将数据存入数据库,最后返回上传结果给前端。 下面是一个简单的示例代码,仅供参考: 前端代码: ```vue <template> <el-upload class="upload-demo" drag action="/api/upload" :before-upload="beforeUpload" :on-success="onSuccess" :on-error="onError" > <i class="el-icon-upload"></i> <div class="el-upload__text">将 Excel 文件拖到此处,或点击上传</div> <div class="el-upload__tip" slot="tip">仅支持 .xls 和 .xlsx 格式的 Excel 文件</div> </el-upload> </template> <script> export default { methods: { beforeUpload(file) { const isExcel = file.type === 'application/vnd.ms-excel' || file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; if (!isExcel) { this.$message.error('只能上传 .xls 或 .xlsx 格式的 Excel 文件'); } return isExcel; }, onSuccess(response) { if (response.code === 0) { this.$message.success('上传成功'); } else { this.$message.error(`上传失败: ${response.msg}`); } }, onError(error) { this.$message.error(`上传失败: ${error.message}`); }, }, }; </script> ``` 后端代码: ```java @RestController @RequestMapping("/api") public class UploadController { @PostMapping("/upload") public Result<?> upload(@RequestParam("file") MultipartFile file) throws IOException { if (file.isEmpty()) { return Result.error("上传失败: 文件为空"); } String filename = file.getOriginalFilename(); String ext = FilenameUtils.getExtension(filename); if (!"xls".equals(ext) && !"xlsx".equals(ext)) { return Result.error("上传失败: 仅支持 .xls 或 .xlsx 格式的 Excel 文件"); } List<User> userList = new ArrayList<>(); Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if (row == null) { continue; } User user = new User(); user.setName(row.getCell(0).getStringCellValue()); user.setAge((int) row.getCell(1).getNumericCellValue()); user.setGender(row.getCell(2).getStringCellValue()); userList.add(user); } userService.saveAll(userList); return Result.ok(); } } ``` 上述代码中,`UploadController`是一个Spring MVC的控制器类,用于处理上传文件的请求。`upload`方法接收一个`MultipartFile`类型的参数,即前端上传的文件数据。在方法中,我们首先判断文件是否为空,然后根据文件的扩展名判断是否为Excel文件。如果不是Excel文件,则返回上传失败的结果。否则,我们使用Apache POI库解析Excel文件,将数据转换成`User`对象并存入数据库。最后,返回上传成功的结果。 需要注意的是,上述代码中的`User`对象是一个自定义的Java类,用于存储Excel中的数据。在实际开发中,需要根据实际情况定义相应的Java类来存储数据。同时,还需要在Spring Boot的配置文件中配置数据库连接信息、数据源等相关信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在比萨斜塔吃披萨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值