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

Java 使用 Easy Excel 进行 Excel 数据导入导出

1. 通过 Maven 下载 Easy Excel 依赖包

在项目的 pom.xml 文件中添加以下依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> <!-- 使用最新版本 -->
</dependency><!-- 如果使用 Lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope>
</dependency>

maven下载依赖包详情见文章:https://blog.csdn.net/Y1_again_0_again/article/details/148828971?spm=1011.2124.3001.6209

2. 创建 Excel 对应的实体类

根据Excel表格的列名(如"姓名")和数据类型(如字符串类型),创建对应的Java类来映射表格结构。

使用 Lombok 插件快速创建实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data // 自动添加 get&set 方法、toString 方法
@AllArgsConstructor // 自动添加有参构造方法
@NoArgsConstructor // 自动添加无参构造方法
public class UserData {@ExcelProperty("用户ID") // 对应 Excel 表头private Integer id;@ExcelProperty("用户名")private String username;@ExcelProperty("年龄")private Integer age;@ExcelProperty("邮箱")private String email;@ExcelProperty("注册时间")private Date registerTime;
}

3. Excel 数据读取

执行 Excel 数据读取并输出结果:

List<StudentsData> students = EasyExcel.read("D:\\Users\\1\\IdeaProjects\\Test_Java_Maven\\src\\test\\resources\\test.xlsx").head(UserData.class).sheet(0).doReadSync();
System.out.println(students);

基本读取方法

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;public class ExcelReader {public static void main(String[] args) {// 文件路径String fileName = "user_data.xlsx";// 读取 Excel 文件EasyExcel.read(fileName, UserData.class, new PageReadListener<UserData>(dataList -> {// 每次读取 100 条数据会保存一次,处理读取到的数据for (UserData user : dataList) {System.out.println("读取到数据: " + user);// 这里可以添加业务逻辑,如保存到数据库}})).sheet().doRead();}
}

自定义读取监听器(更灵活)

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;public class UserDataListener implements ReadListener<UserData> {@Overridepublic void invoke(UserData data, AnalysisContext context) {// 逐行读取数据System.out.println("解析到一条数据: " + data);// 业务处理...}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("所有数据解析完成");}
}// 使用自定义监听器
EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();

4. 写入 Excel 数据

基本写入方法

import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class ExcelWriter {public static void main(String[] args) {// 文件路径String fileName = "output_user_data.xlsx";// 模拟数据List<UserData> dataList = new ArrayList<>();dataList.add(new UserData(1, "张三", 25, "zhangsan@example.com", new Date()));dataList.add(new UserData(2, "李四", 30, "lisi@example.com", new Date()));dataList.add(new UserData(3, "王五", 28, "wangwu@example.com", new Date()));// 写入 ExcelEasyExcel.write(fileName, UserData.class).sheet("用户数据") // 工作表名称.doWrite(dataList);}
}

复杂写入示例(设置表头、样式等)

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.IndexedColors;public class AdvancedExcelWriter {public static void main(String[] args) {String fileName = "advanced_user_data.xlsx";// 设置表头样式WriteCellStyle headStyle = new WriteCellStyle();headStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); // 蓝色背景// 设置内容样式WriteCellStyle contentStyle = new WriteCellStyle();contentStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 浅灰色背景HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(headStyle, contentStyle);EasyExcel.write(fileName, UserData.class).registerWriteHandler(styleStrategy) // 注册样式策略.sheet("高级用户数据").doWrite(DataGenerator.generateUserData());}
}

5. 实际应用场景示例

批量导入用户数据到数据库

import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Service;@Service
public class UserImportService {@Autowiredprivate UserRepository userRepository;public void importUsersFromExcel(String filePath) {EasyExcel.read(filePath, UserData.class, new ReadListener<UserData>() {// 每读取100条保存一次private static final int BATCH_SIZE = 100;private List<UserData> cachedDataList = new ArrayList<>(BATCH_SIZE);@Overridepublic void invoke(UserData userData, AnalysisContext analysisContext) {cachedDataList.add(userData);if (cachedDataList.size() >= BATCH_SIZE) {saveData();cachedDataList = new ArrayList<>(BATCH_SIZE);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {saveData();}private void saveData() {if (!cachedDataList.isEmpty()) {userRepository.saveAll(cachedDataList.stream().map(this::convertToEntity).collect(Collectors.toList()));}}private User convertToEntity(UserData userData) {User user = new User();user.setUsername(userData.getUsername());user.setAge(userData.getAge());user.setEmail(userData.getEmail());return user;}}).sheet().doRead();}
}
http://www.lqws.cn/news/556741.html

相关文章:

  • 一分钟了解思路链提示词(Chain-of-thought Prompting)
  • uni-app manifest.json 配置:定制化应用的各项功能和行为
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(二)- 职位数据清洗与预处理
  • 《自动控制原理 》- 第 1 章 自动控制的基本原理与方式
  • Linux基本指令篇 —— more指令
  • PostgreSQL 中,若需显示 不在 `IN` 子句列表中的数据
  • SQL常用命令
  • 阿里云Ubuntu服务器上安装MySQL并配置远程连接
  • 网络缓冲区
  • Solidity学习 - 错误处理
  • ffpaly播放 g711a音频命令
  • 【学习笔记】深入理解Java虚拟机学习笔记——第12章 Java内存模型与线程
  • 设计模式之抽象工厂模式
  • Docker 入门教程(五):Docker 命令思维导图
  • 【分布式机架感知】分布式机架感知能力的主流存储系统与数据库软件
  • 微处理原理与应用篇---STM32寄存器控制GPIO
  • 矩阵的条件数(Condition Number of a Matrix)
  • 华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio安装NoteGen AI笔记应用程序
  • Learning PostgresSQL读书笔记: 第11章 Transactions, MVCC, WALs, and Checkpoints
  • 基于Docker的mosquitto安装测试
  • FPGA设计的上板调试
  • python多线程详细讲解
  • Python爬虫实战:研究difflib库相关技术
  • Ubuntu 主机通过 `enp4s0` 向开发板共享网络的完整步骤
  • 默克树技术原理
  • 组成原理--指令指令集寻址方式的介绍
  • ubuntu-server 与 ubuntu-live-server 的区别 笔记250628
  • Java锁机制知识点
  • 网关ARP防护的措施
  • 【开源初探】基于Qwen2.5VL的OCRFlux