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

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

相关推荐
吾日三省吾码3 小时前
JVM 性能调优
java
弗拉唐4 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi774 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
2401_857610034 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
少说多做3434 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀4 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20205 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深5 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
凌冰_5 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis