当前位置: 首页 > news >正文

Excel大数据量导入导出

github源码 地址(更详细) : https://github.com/alibaba/easyexcel

文档:读Excel(文档已经迁移)

B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc

一、JAVA解析EXCEL工具EasyExcel

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的AP可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POl sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POl的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

64M内存1分钟内读取75M(46W行25列)的Excel

二、EasyExcel的使用

EasyExcel的相关依赖

添加 maven 依赖
<!-- Alibaba Excel 依赖 -->
<!--它提供了高性能的读写功能,特别适合处理大型 Excel 文件 -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.4</version>
</dependency>
<!-- Apache POI 依赖 -->
<!--poi 是 Apache POI 项目的核心库,提供了读写 Microsoft Office 格式文件的基础功能,包括 .xls 文件 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version>
</dependency>
<!-- SLF4J 和 Logback 依赖 -->
<!-- 日志 -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version>
</dependency>

三、Excel

创建实体类
@ExcelProperty 注解的 value 属性是一个数组类型 , 设置多个 head 时会自动合并,用于指定Excel表格中该字段的显示名称(起名字)
@NoArgsConstructor @AllArgsConstructor Lombok 库提供的注解
@NoArgsConstructor 生成一个无参构造函数(即没有参数的构造函数)
@AllArgsConstructor 生成一个全参构造函数(即包含类中所有字段的构造函数)
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class User {@ExcelProperty(value = "用户编号")private Integer userId;@ExcelProperty(value = "姓名")private String userName;@ExcelProperty(value = "性别")private String gender;@ExcelProperty(value = "工资")private Double salary;@ExcelProperty(value = "入职时间")private Date hireDate;// lombok 会生成getter/setter方法
}
1.简单写入方法一
    /*** 简单写方法一*/@Testpublic void text01(){//创建一个Excel文档String fileName = "D:\\excel\\user1.xlsx";//根据user模板构建数据List<User> users = new ArrayList<>();User user1 = new User(1,"张三","男",666.66,new Date());User user2 = new User(2,"张三","男",666.66,new Date());User user3 = new User(3,"张三","男",666.66,new Date());User user4 = new User(4,"张三","男",666.66,new Date());users.add(user1);users.add(user2);users.add(user3);users.add(user4);//向Excel表格中写数据EasyExcel.write(fileName,User.class).sheet("用户信息").doWrite(users);}
2.简单写入方法二
 /*** 简单写方法二*/@Testpublic void text02(){//创建一个Excel文档String fileName = "D:\\excel\\user2.xlsx";//根据user模板构建数据List<User> users = new ArrayList<>();User user1 = new User(1,"张三","男",666.66,new Date());User user2 = new User(2,"张三","男",666.66,new Date());User user3 = new User(3,"张三","男",666.66,new Date());User user4 = new User(4,"张三","男",666.66,new Date());users.add(user1);users.add(user2);users.add(user3);users.add(user4);//向Excel表格中写数据//创建ExcelWriter对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();//创建sheet对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();excelWriter.write(users,writeSheet);//关闭ExcelWriter对象(一定要关闭,不然会导致内存溢出)excelWriter.finish();}
 3.排除掉某些不想添加的字段
   /*** 排除掉模板中的某几项属性*/@Testpublic void text03(){//创建一个Excel文档String fileName = "D:\\excel\\user3.xlsx";//根据user模板构建数据List<User> users = new ArrayList<>();User user1 = new User(1,"张三","男",666.66,new Date());User user2 = new User(2,"张三","男",666.66,new Date());User user3 = new User(3,"张三","男",666.66,new Date());User user4 = new User(4,"张三","男",666.66,new Date());users.add(user1);users.add(user2);users.add(user3);users.add(user4);//设置排除的属性Set<String> set = new HashSet<>();set.add("salary");set.add("hireDate");//向Excel表格中写数据EasyExcel.write(fileName, User.class).excludeColumnFiledNames(set).sheet("用户信息").doWrite(users);}
4.复杂头数据写入
@ExcelProperty 注解的 value 属性是一个数组类型 , 设置多个 head 时会自动合并
/*** 复杂头实体类*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class ComplexHeadUser {@ExcelProperty(value = {"group1", "用户编号"}, index = 0)private Integer userId;@ExcelProperty(value = {"group1", "姓名"}, index = 1)private String userName;@ExcelProperty(value = {"group2", "入职时间"}, index = 2)private Date hireDate;
}
  /*** 复杂头*/@Testpublic void text05(){//创建一个Excel文档String fileName = "D:\\excel\\user5.xlsx";//根据user模板构建数据List<ComplexHeadUser> users = new ArrayList<>();ComplexHeadUser user1 = new ComplexHeadUser(1,"张三",new Date());ComplexHeadUser user2 = new ComplexHeadUser(2,"张三",new Date());ComplexHeadUser user3 = new ComplexHeadUser(3,"张三",new Date());users.add(user1);users.add(user2);users.add(user3);//向Excel表格中写数据EasyExcel.write(fileName, ComplexHeadUser.class).sheet("用户信息").doWrite(users);}
//或
@Test
public void testWriteExcel6() {String filename = "D:\\study\\user6.xlsx";List<ComplexHeadUser> users = new ArrayList<>();for (int i = 1; i <= 10; i++) {ComplexHeadUser user = ComplexHeadUser.builder().userId(i).userName("大哥" + i).hireDate(new Date()).build();users.add(user);}// 向Excel中写入数据EasyExcel.write(filename, ComplexHeadUser.class).sheet("用户信息").doWrite(users);
}
处理百万级批量数据
处理百万级批量数据时,性能和内存管理是关键问题。 EasyExcel 提供了一些优化策略来处理大规模数据,包括分页读取和分批写入。下面是一些常用的优化技巧:
1. 分批写入
对于写操作,可以使用 EasyExcel 的分批写入功能,这样可以避免一次性加载大量数据导致的内存溢 出问题。
假设您有一个 User 类,定义如下:
/*** 创建User类模板,通过User类模板向Excel表格中写数据*  @ExcelProperty这个注解用于指定Excel表格中该字段的显示名称(起名字)*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class User {@ExcelProperty(value = "用户编号")private Integer userId;@ExcelProperty(value = "姓名")private String userName;@ExcelProperty(value = "性别")private String gender;@ExcelProperty(value = "工资")private Double salary;@ExcelProperty(value = "入职时间")private Date hireDate;// lombok 会生成getter/setter方法}
 /*** 处理百万级批量数据*/@Testpublic void text06(){//创建一个Excel文档String fileName = "D:\\excel\\user6.xlsx";// 确保目录存在File directory = new File("D:\\excel");if (!directory.exists()) {directory.mkdirs();}// 分批大小int batchSize = 10000;// 创建 ExcelWriter 对象ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build();for (List<User> data : dataList(batchSize)) {// 创建 sheet 对象WriteSheet writeSheet = EasyExcel.writerSheet("用户信息").build();// 写数据excelWriter.write(data, writeSheet);}excelWriter.finish();System.out.println("Excel文件已成功创建!");}private List<List<User>> dataList(int batchSize) {List<List<User>> allData = new ArrayList<>();int totalRecords = 1000000; // 假设有 100 万条记录for (int i = 0; i < totalRecords; i += batchSize) {List<User> batch = new ArrayList<>();for (int j = 0; j < batchSize && i + j < totalRecords; j++) {User user = User.builder().userId(i + j + 1).userName("用户" + (i + j + 1)).gender(j % 2 == 0 ? "男" : "女").salary(10000.0 + (i + j) * 1000.0).hireDate(new Date()).build();batch.add(user);}allData.add(batch);}return allData;}
解释
1. 分批大小 batchSize 定义了每批写入的数据量。可以根据实际需求调整这个值。
2. 创建 ExcelWriter 对象 :使用 EasyExcel.write 方法创建 ExcelWriter 对象,并指定文件路径和数据模型类。
3. 分批写入数据 dataList 方法生成分批的数据列表,每次调用 doWrite 方法写入一批数据。

相关文章:

Excel大数据量导入导出

github源码 地址&#xff08;更详细&#xff09; : https://github.com/alibaba/easyexcel 文档&#xff1a;读Excel&#xff08;文档已经迁移&#xff09; B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc 一、JAVA解析EXCEL工具EasyExcel Java解析、生成Excel比较…...

Linux系统命令无法使用(glib库相关问题)

1.背景描述 Yum强制安装了一些软件&#xff0c;安装软件成功无报错&#xff0c;完成后不久突然发现系统出问题了&#xff0c;所有的命令无法使用了&#xff0c;如ls、mv、cat等基本命令报错。 relocation error&#xff1a; /lib64/libpthread.so.0: symbol_libc_dl_error_tsd …...

Qt修仙之路2-1 仿QQ登入 法宝初成

widget.cpp #include "widget.h" #include<QDebug> //实现槽函数 void Widget::login1() {QString userusername_input->text();QString passpassword_input->text();//如果不勾选无法登入if(!check->isChecked()){qDebug()<<"xxx"&…...

DeepSeek-V3 论文解读:大语言模型领域的创新先锋与性能强者

论文链接&#xff1a;DeepSeek-V3 Technical Report 目录 一、引言二、模型架构&#xff1a;创新驱动性能提升&#xff08;一&#xff09;基本架构&#xff08;Basic Architecture&#xff09;&#xff08;二&#xff09;多令牌预测&#xff08;Multi-Token Prediction&#xf…...

配置#include “nlohmann/json.hpp“,用于处理json文件

#include “nlohmann/json.hpp” // 需要安装 nlohmann/json.hpp 头文件 using json = nlohmann::json; 下载链接:https://github.com/nlohmann/json/tree/develop 1.下载并解压:首先,需要从nlohmann/json的GitHub仓库下载源代码,并解压得到的文件。 地址: nlohmann/json…...

索引失效的14种常见场景

在 MySQL 中&#xff0c;索引有时可能会失效&#xff0c;导致查询性能下降。以下是常见的 14 种场景&#xff0c;在这些场景下&#xff0c;索引可能会失效 1. 使用 OR 连接多个条件 场景: 当查询中包含 OR 时&#xff0c;如果 OR 连接的多个条件中有一个没有使用索引&#xff0…...

解决com.kingbase8.util.KSQLException: This _connection has been closed.

问题描述 一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend.java.net.SocketTime…...

openAI官方prompt技巧(二)

1. 赋予 ChatGPT 角色 为 ChatGPT 指定一个角色&#xff0c;让其从特定的身份或视角回答问题。这有助于生成针对特定受众或场景的定制化回答。 例如&#xff1a; 你是一名数据分析师&#xff0c;负责我们的市场营销团队。请总结上个季度的营销活动表现&#xff0c;并强调与未…...

【非 root 用户下全局使用静态编译的 FFmpeg】

在非 root 用户下全局使用静态编译的 FFmpeg&#xff0c;可以按照以下方法操作&#xff1a; 1. 下载静态编译的 FFmpeg 如果你还没有下载静态编译的 FFmpeg&#xff0c;可以从官方网站获取&#xff1a; wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd6…...

【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

前言 本文主要介绍我最近开发的一个个人实战项目&#xff0c;“基于深度学习的人脸门禁 IPC 智能安防监控系统”&#xff0c;全程满帧流畅运行。这个项目我目前全网搜了一圈&#xff0c;还没发现有相关类型的开源项目。这个项目只要稍微改进下&#xff0c;就可以变成市面上目前…...

前端布局与交互实现技巧

前端布局与交互实现技巧 1. 保持盒子在中间位置 在网页设计中&#xff0c;经常需要将某个元素居中显示。以下是一种常见的实现方式&#xff1a; HTML 结构 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><m…...

idea 找不到或者无法加载主类

idea项目&#xff0c;之前一直是正常运行的&#xff0c;放假了之后再回来就遇到启动不了的问题。 WebApplication这个类右键运行的时候&#xff0c;也提示找不到主类。 对于这种之前运行没有问题&#xff0c;突然出问题的项目。 我的点是没有改动代码和数据的情况下项目就跑不起…...

Flink 调用海豚调度器 SQL 脚本实现1份SQL流批一体化的方案和可运行的代码实例

目录 一、流批一体化概述 二、Flink 与海豚调度器结合实现流批一体化的好处 2.1 代码复用性增强 2.2 开发和维护成本降低 2.3 数据一致性保证 2.4 提高系统的灵活性和可扩展性 三、实现思路步骤 3.1 环境准备 3.2 编写 SQL 脚本并上传到海豚调度器 3.3 实现资源下载功…...

ES6 Map 数据结构是用总结

1. Map 基本概念 Map 是 ES6 提供的新的数据结构&#xff0c;它类似于对象&#xff0c;但是"键"的范围不限于字符串&#xff0c;各种类型的值&#xff08;包括对象&#xff09;都可以当作键。Map 也可以跟踪键值对的原始插入顺序。 1.1 基本用法 // 创建一个空Map…...

go结构体详解

结构体简介 Golang 中没有“类”的概念&#xff0c;Golang 中的结构体和其他语言中的类有点相似。和其他面向对象语言中的类相比&#xff0c;Golang 中的结构体具有更高的扩展性和灵活性。 Golang 中的基础数据类型可以表示一些事物的基本属性&#xff0c;但是当我们想表达一…...

机器学习-关于线性回归的表示方式和矩阵的基本运算规则

最近在学习机器学习的过程中&#xff0c;发现关于线性回归的表示和矩阵的运算容易费解&#xff0c;而且随着学习的深入容易搞混&#xff0c;因此特意做了一些研究&#xff0c;并且记录下来和大家分享。 一、线性模型有哪些表示方式&#xff1f; 器学习中&#xff0c;线性模型…...

kafka 3.5.0 raft协议安装

前言 最近做项目&#xff0c;需要使用kafka进行通信&#xff0c;且只能使用kafka&#xff0c;笔者没有测试集群&#xff0c;就自己搭建了kafka集群&#xff0c;实际上笔者在很早之前就搭建了&#xff0c;因为当时还是zookeeper&#xff08;简称ZK&#xff09;注册元数据&#…...

后台管理系统网页开发

CSS样式代码 /* 后台管理系统样式文件 */ #container{ width:100%; height:100%; /* background-color:antiquewhite;*/ display:flex;} /* 左侧导航区域:宽度300px*/ .left{ width:300px; height: 100%; background-color:#203453; display:flex; flex-direction:column; jus…...

使用一个大语言模型对另一个大语言模型进行“调教”

使用一个大语言模型对另一个大语言模型进行“调教”&#xff08;通常称为微调或适配&#xff09;&#xff0c;是一种常见的技术手段&#xff0c;用于让目标模型更好地适应特定的任务、领域或风格。以下是基于搜索结果整理的详细步骤和方法&#xff1a; 1.准备工作 安装必要的…...

golang使用sqlite3,开启wal模式,并发读写

因为sqlite是基于文件的&#xff0c;所以默认情况下&#xff0c;sqlite是不支持并发读写的&#xff0c;即写操作会阻塞其他操作&#xff0c;同时sqlite也很容易就产生死锁。 但是作为一个使用广泛的离线数据库&#xff0c;从sqlite3.7.0版本开始&#xff08;SQLite Release 3.…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...