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

news2024/9/22 9:42:12

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

文章目录

    • 写在前面的话
    • EasyPOI 统括
      • 技术简介
      • SB 整合 EasyPOI
      • 文件太大报错
      • 大数据量导入
    • 总结陈词

在这里插入图片描述

写在前面的话

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的基础用法,仅供参考,希望可以帮助到大家。
💗 后续会更新企业常用技术栈的若干系列文章,敬请期待。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯嵌入式第十五届模拟考试3解析

1 题目 2 程序 /* USER CODE BEGIN PTD */ char buf1[20],buf2[20],buf3[20],buf4[20],buf5[20],buf6[20],buf7[20],buf8[20],buf9[20]; struct keys {int step;int length;int state; }key[5]; int display; double v1,v2; int t; double v1l1.2,v1u2.2,v2l1.4,v2u3.0; dou…

深度学习复盘与论文复现D

文章目录 一、新环境搭建与适应1、easy_install和pip的安装使用2、关于安装包超时的解决方案3、brew安装包安装4、使用新环境运行以前项目5、解决win的pycharm修改内存后无法启动 二、Dataset 数据读取问题1、Lightning Torch 读取数据2、Pytorch的DataLoader数据读取机制3、Py…

Dify中的经济索引模式实现过程

当索引模式为经济时&#xff0c;使用离线的向量引擎、关键词索引等方式&#xff0c;降低了准确度但无需花费 Token。 一.提取函数**_extract** 根据不同文档类型进行内容的提取&#xff1a; def _extract(self, index_processor: BaseIndexProcessor, dataset_document: Data…

力扣经典题目之->移除值为val元素的讲解,的实现与讲解

一&#xff1a;题目 博主本文将用指向来形象的表示下标位的移动。 二&#xff1a;思路 1&#xff1a;两个整形&#xff0c;一个start&#xff0c;一个end&#xff0c;在一开始都 0&#xff0c;即这里都指向第一个元素。 2&#xff1a;在查到val之前&#xff0c;查一个&…

C语言 ——— 将一句英语短句中的单词进行倒置

目录 题目要求 代码实现 题目要求 将一句英语短句中的单词进行倒置&#xff0c;标点符号不倒置 如&#xff1a; 输入&#xff1a;"I like chongqing very much," 输出&#xff1a;"much, very chongqing like I" 代码实现 #include<stdio.h> #i…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

搭建调用链监控Zipkin和Sleuth

项目环境: win7、jdk8 1、添加依赖&#xff0c;添加了spring-cloud-starter-zipkin会自动导入Sleuth <!--Sleuth&#xff0c;zipkin--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</…

安卓onNewIntent 什么时候执行

一.详细介绍 onNewIntent 方法 onNewIntent 是 Android 中 Activity 生命周期的一部分。它在特定情况下被调用&#xff0c;主要用于处理新的 Intent&#xff0c;而不是创建新的 Activity 实例。详细介绍如下&#xff1a; 使用场景 singleTop 启动模式&#xff1a; 如果一个 Ac…

python+mysql图书管理系统,谈谈思路及实现代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【链表】算法题(一) ---- 力扣 / 牛客

一、移除链表元素 移除链表中值为val的元素&#xff0c;并返回新的头节点 思路&#xff1a; 题目上这样说&#xff0c;我们就可以创建一个新的链表&#xff0c;将值不为val的节点&#xff0c;尾插到新的链表当中&#xff0c;最后返回新链表的头节点。 typedef struct ListNo…

java《字符串进阶篇》--习题逐语句分析及认识链式编程

一、前言 字符串相关的习题分享&#xff0c;随着学习的深入&#xff0c;应该要多做一些习题来巩固知识点&#xff0c;而不是一味的去学习新的东西。这几天尽可能地去给大家分享一些常用的方法及习题的讲解&#xff0c;希望大家认真观看&#xff0c;每一道题都有对应的分析。基…

GAMMA数据处理(八)

新学习了一个命令&#xff1a; SLC_cat_ScanSAR - Concatenate sequential ScanSAR burst SLC images (Sentinel-1, TSX, RCM...)&#xff0c;做数据拼接的。之前一直没有涉及到拼接问题&#xff0c;就一直没管。如果研究区包含两景SLC&#xff0c;可以拼接成一景。但是不知道…

计算机丢失CH375DLL怎么办,CH375DLL.DLL;计算机找不到CH375DLL怎么办,CH375DLL.DLL

翻遍CSDN&#xff0c;发现的文章不是只有描述不给资源&#xff0c;要不就是资源收费。 真是狗屎啊&#xff1b; 在千辛万苦找到资源后&#xff0c;我决定写一篇&#xff1b; 首先是资源文件下载 我上传的&#xff1a;&#xff08;肯定是0积分&#xff0c;如果收费了告诉我&…

Nuxt.js 错误侦探:useError 组合函数

title: Nuxt.js 错误侦探&#xff1a;useError 组合函数 date: 2024/7/14 updated: 2024/7/14 author: cmdragon excerpt: 摘要&#xff1a;文章介绍Nuxt.js中的useError组合函数&#xff0c;用于统一处理客户端和服务器端的错误&#xff0c;提供statusCode、statusMessage和…

IOT 可编程控制系统

IOT&#xff08;物联网&#xff09;可编程控制系统&#xff0c;如GF-MAXCC等&#xff0c;是一种集成了多种先进技术和功能的智能化控制设备&#xff0c;它能够在物联网系统中发挥关键作用&#xff0c;实现对多种设备的集中管理和控制。具体来说&#xff0c;IOT可编程控制系统的…

7天学会CANOpen

本系列文章&#xff0c;主要介绍CANOpen的学习知识&#xff0c;能够全面掌握CANOpen原理。文章会不定期的更新。 学习基础&#xff1a;CAN通信。 1. CANOpen通信协议1 2. CANOpen对象字的理解 3. CANOpen之CAN-ID、NODE-ID、COB-ID 4. CanOpen报文类型 5. CANO报文---SDO…

python 怎样生成窗体

通过import tkinter导入Tkinter模块&#xff0c;没有这句下面的都不成立了。 wintkinter.Tk()&#xff0c;这句是创建windows的窗口对象&#xff0c;注意后面的Tk&#xff0c;大小写。 win.title("窗口")&#xff0c;这段是设置窗口上的标题。 另外窗口的大小你可以通…

Paddle 打包部署

PaddleOCR 打包部署exe 心酸历程 PaddleOCR部署exe模式PaddleOCR安装到本地(稍后有时间再写)PaddleOCR打包过程异常问题记录&#xff01;&#xff01;&#xff01;&#xff01;No such file or directory: D:\\py_project\\paddleOCR\\dist\\paddleOCR\\_internal\\paddleocr\\…

JVM:垃圾回收器

文章目录 一、介绍二、年轻代-Serial垃圾回收器三、老年代-SerialOld垃圾回收器四、年轻代-ParNew垃圾回收器五、老年代-CMS&#xff08;Concurrent Mark Sweep&#xff09;垃圾回收器六、年轻代-Parllel Scavenge垃圾回收器七、Parallel Old垃圾回收器八、G1垃圾回收器 一、介…

《Python数据科学之五:模型评估与调优深入解析》

《Python数据科学之五&#xff1a;模型评估与调优深入解析》 在数据科学项目中&#xff0c;精确的模型评估和细致的调优过程是确保模型质量、提高预测准确性的关键步骤。本文将详细探讨如何利用 Python 及其强大的库进行模型评估和调优&#xff0c;确保您的模型能够达到最佳性能…