《后端程序猿 · 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的基础用法,仅供参考,希望可以帮助到大家。

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

相关推荐
hanbarger11 分钟前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye18 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋330 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行32 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园35 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
wm10431 小时前
java web springboot
java·spring boot·后端
smile-yan1 小时前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风1 小时前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~1 小时前
Maven极简安装&配置-241223
java·maven
皮蛋很白1 小时前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea