《后端程序猿 · EasyPOI 导入导出》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,如需交流,欢迎留言评论。👍

在这里插入图片描述

写在前面的话

Excel 文件导入和导出是程序猿十分常见的需求,无论是企业开发还是外单开发中,此类需求选对一个合适的类库,绝对可以事半功倍,如果你的导入导出需求不是那种非常复杂的,那建议你采用EasyPOI试试。
本篇文章介绍一下EasyPOI的实际应用,希望可以帮助到大家。

Tips:宣室求贤访逐臣,贾生才调更无伦。可怜夜半虚前席,不问苍生问鬼神。


EasyPOI 统括

技术简介

EasyPOI 是一个基于 Apache POI 的开源 Java 库,用于简化 Excel 文件的读写操作。它提供了一系列简单易用的 API,使得操作 Excel 文件变得更加方便和高效。EasyPOI 旨在解决 POI 库在处理 Excel 文件时的复杂性和易用性问题。
EasyPOI 是一个功能强大的 Java 库,它通过提供简单的 API 和丰富的功能,使得 Excel 文件的读写操作变得更加高效和易于管理。对于需要在 Java 应用程序中处理 Excel 文件的开发者来说,EasyPOI 是一个非常好的选择。

Tips:这类型技术也没必要关注其概念和特征,注重帮助我们解决了哪些问题即可,当然技术狂热者另说。


SB 整合 EasyPOI

Step1、引入 Maven 依赖,整合第一步基本是这个

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.4.0</version>
</dependency>

Step2、创建实体类
创建一个实体类用于映射 Excel 数据,如果您的导入导出需求,是Excel的数据、页面的数据、数据库表的数据都一致的简单场景,那可以直接像下面示例这样,先创建数据库表,再用代码生成工具生成实体,最后添加上@Excel等注解,绑定Excel文档的信息。

@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
@Alias("DyPhoneRecord")
@ApiModel(description = "DY电话记录表实体")
@ExcelTarget("dyPhone")
public class DyPhoneRecord extends BaseEntity {

    @ApiModelProperty(value = "唯一ID")
    private Long orderId;

    @ApiModelProperty(value = "手机号码")
    @Excel(name = "手机号码", orderNum = "1", width = 15D)
    private String userPhone;

    @ApiModelProperty(value = "客户姓名")
    @Excel(name = "客户姓名", orderNum = "2", width = 15D)
    private String userName;

    @ApiModelProperty(value = "入网时间")
    @Excel(name = "入网时间", orderNum = "8", width = 15D, importFormat = "yyyy-MM-dd")
    private String exG;
}

Step3、创建导入导出服务的Service层

@Service
public class ExcelService {

    public List<DyPhoneRecord> importExcel(MultipartFile file) throws Exception {
        ImportParams params = new ImportParams();
        return ExcelImportUtil.importExcel(file.getInputStream(), DyPhoneRecord.class, params);
    }

    public void exportExcel(HttpServletResponse response, List<DyPhoneRecord> dyPhoneRecord) throws IOException {
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("电话记录表", "电话"), DyPhoneRecord.class, dyPhoneRecord);
        response.setHeader("Content-Disposition", "attachment;filename=dyPhoneRecord.xlsx");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        workbook.write(response.getOutputStream());
        workbook.close();
    }
}

Step4、创建导入导出服务的Controller层

@RestController
@RequestMapping("/excel")
public class ExcelController {

    @Autowired
    private ExcelService excelService;

    @PostMapping("/import")
    public List<DyPhoneRecord> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
        return excelService.importExcel(file);
    }

    @GetMapping("/export")
    public void exportExcel(HttpServletResponse response) throws IOException {
        List<DyPhoneRecord> dyPhoneRecords = findListByDb();
        excelService.exportExcel(response, dyPhoneRecords);
    }
}

Step5、运行测试
运行 Spring Boot 应用程序,访问以下 URL 来测试导入和导出功能:
导入 Excel: POST http://localhost:8080/excel/import,在请求中上传一个 Excel 文件。
导出 Excel: GET http://localhost:8080/excel/export,浏览器会下载一个名为 dyPhoneRecord.xlsx 的文件。


文件太大报错

描述:如果导入的文件太大,会出现异常,此时修改下面属性配置即可

# 图片大小设置:The field file exceeds its maximum permitted size of 1048576 bytes.
spring:
  servlet:
    multipart:
      max-file-size: 200MB
      max-request-size: 200MB

大数据量导入

描述:如果一次性导入的Excel文件内容较大,例如达到几百万条,并且这部分数据还要做入库动作,那需要额外考虑两个问题,一个是数据太大,内存直接溢出,另一个是耗时较慢,特别是入库层面。

【解决思路1】
ExcelImportUtil.importExcelMore 方法用于从 Excel 文件中导入数据,并将其转换为指定类型的 Java 对象列表。它能够处理较大的 Excel 文件,并支持分批次读取数据,防止内存溢出,这边不展开介绍。
对应导出端的代码可以参考: exportBigExcel 。

【解决思路2】
利用Guava等类库提供的 Lists.partition方法,将一个列表按照指定的大小分割成多个子列表,再利用MyBatis的JDBC批量插入模式快速插入(NamedParameterJdbcTemplate),这边不展开介绍。

public void updateStatusBach(List<MessageRecord> list, String vaule) {
    List<List<MessageRecord>> partition = Lists.partition(list, 1000);
    for (List<MessageRecord> messageRecords : partition) {
        messageRecordDao.updateStatusBach(messageRecords, vaule);
    }
}

总结陈词

上文介绍了EasyPOI的基础用法,仅供参考,希望可以帮助到大家。
💗 后续会更新企业常用技术栈的若干系列文章,敬请期待。

在这里插入图片描述

相关推荐

  1. EasyPOI导出动态表头

    2024-07-15 06:44:01       33 阅读
  2. Easypoi word 模板导出问题

    2024-07-15 06:44:01       53 阅读
  3. excel的导入

    2024-07-15 06:44:01       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 06:44:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 06:44:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 06:44:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 06:44:01       69 阅读

热门阅读

  1. ArrayList和LinkedList的区别

    2024-07-15 06:44:01       24 阅读
  2. 【python】数据类型和运算符

    2024-07-15 06:44:01       21 阅读
  3. 前端系列-5 SCSS使用介绍

    2024-07-15 06:44:01       25 阅读
  4. Flutter笔记--WebSocket

    2024-07-15 06:44:01       23 阅读
  5. MongoDB Shard 集群 Docker 部署

    2024-07-15 06:44:01       26 阅读
  6. 数据结构第27节 优先队列

    2024-07-15 06:44:01       21 阅读
  7. 速盾:cdn技术是什么意思?

    2024-07-15 06:44:01       23 阅读
  8. 使用adb连接安卓手机

    2024-07-15 06:44:01       23 阅读
  9. Android人脸解锁源码解析

    2024-07-15 06:44:01       17 阅读
  10. 速盾:高防cdn和普通cdn的区别?

    2024-07-15 06:44:01       29 阅读
  11. Tick数据的清洗和1分钟K线合成

    2024-07-15 06:44:01       18 阅读
  12. App测试自动化工具UIAutomator2的使用

    2024-07-15 06:44:01       23 阅读
  13. React@16.x(57)Redux@4.x(6)- 实现 bindActionCreators

    2024-07-15 06:44:01       28 阅读