《后端程序猿 · 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 依赖,整合第一步基本是这个

xml 复制代码
<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文档的信息。

java 复制代码
@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层

java 复制代码
@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层

java 复制代码
@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 的文件。


文件太大报错

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

yaml 复制代码
# 图片大小设置: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),这边不展开介绍。

java 复制代码
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的基础用法,仅供参考,希望可以帮助到大家。

💗 后续会更新企业常用技术栈的若干系列文章,敬请期待。

相关推荐
TangKenny10 分钟前
计算网络信号
java·算法·华为
肘击鸣的百k路11 分钟前
Java 代理模式详解
java·开发语言·代理模式
城南vision17 分钟前
Docker学习—Docker核心概念总结
java·学习·docker
wyh要好好学习24 分钟前
SpringMVC快速上手
java·spring
尢词26 分钟前
SpringMVC
java·spring·java-ee·tomcat·maven
Mr. zhihao33 分钟前
享元模式在 JDK 中的应用解析
java·享元模式
茶馆大橘36 分钟前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
wrx繁星点点37 分钟前
享元模式:高效管理共享对象的设计模式
java·开发语言·spring·设计模式·maven·intellij-idea·享元模式
真的想不出名儿40 分钟前
Java基础——反射
java·开发语言
鱼跃鹰飞42 分钟前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试