【JAVA】阿里巴巴 EasyExcel:高效的Excel处理解决方案

ops/2024/9/25 17:19:06/

在这里插入图片描述

文章目录

    • EasyExcel
      • 1. EasyExcel 简介
        • 1.1 主要特点
        • 1.2 依赖配置
      • 2. EasyExcel 核心功能
        • 2.1 写入 Excel 文件
        • 2.2 读取 Excel 文件
      • 3. 业务开发示例
      • 4. 进阶用法
        • 4.1 自定义转换器
        • 4.2 自定义格式

更多相关内容可查看

附官网地址:https://easyexcel.opensource.alibaba.com/docs/current/api/

EasyExcel

在现代企业的业务处理中,Excel 文件常常被用来进行数据交换、报告生成和数据分析等任务。然而,处理 Excel 文件可能会变得十分复杂,特别是当数据量很大时。阿里巴巴的 EasyExcel 提供了一个高效、简便的解决方案,用于处理大规模的 Excel 文件。本博客将详细介绍 EasyExcel 的特性、使用方法,并提供具体的业务开发示例和代码。

1. EasyExcel 简介

EasyExcel 是阿里巴巴开源的一个 Java 库,旨在提高 Excel 文件处理的性能。它是基于 POI 的封装,主要用于简化 Excel 文件的读写操作,并且在处理大数据量时表现出色。

1.1 主要特点
  • 高性能:能够处理百万级数据而不占用大量内存。
  • 易用性:提供简单易用的 API,降低使用门槛。
  • 支持大数据量:通过逐行读取和写入,避免一次性加载全部数据到内存中。
  • 注解驱动:通过注解配置简化代码编写,增强可读性。
1.2 依赖配置

要使用 EasyExcel,需要在 Maven 或 Gradle 配置相应的依赖。

Maven 依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.6</version>
</dependency>

Gradle 依赖:

implementation 'com.alibaba:easyexcel:3.0.6'

2. EasyExcel 核心功能

EasyExcel 提供了读写 Excel 文件的基本功能,我们将通过以下示例来深入了解。

2.1 写入 Excel 文件

使用 EasyExcel 写入 Excel 文件非常简单。首先,我们需要定义一个数据模型,并通过注解配置 Excel 文件的表头。

示例数据模型:

java">import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import java.util.Date;public class UserData {@ExcelProperty("用户ID")private Long id;@ExcelProperty("用户姓名")private String name;@ExcelProperty("创建时间")@DateTimeFormat("yyyy-MM-dd HH:mm:ss")private Date createTime;// Getters and Setters
}

写入 Excel 文件代码示例:

java">import com.alibaba.excel.EasyExcel;import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class ExcelWriteExample {public static void main(String[] args) {String fileName = "user_data.xlsx";List<UserData> dataList = new ArrayList<>();dataList.add(new UserData(1L, "Alice", new Date()));dataList.add(new UserData(2L, "Bob", new Date()));EasyExcel.write(fileName, UserData.class).sheet("用户数据").doWrite(dataList);}
}
2.2 读取 Excel 文件

读取 Excel 文件同样直观。我们需要定义一个监听器来处理每一行的数据。

示例数据模型(与写入示例相同):

java">import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import java.util.Date;public class UserData {@ExcelProperty("用户ID")private Long id;@ExcelProperty("用户姓名")private String name;@ExcelProperty("创建时间")@DateTimeFormat("yyyy-MM-dd HH:mm:ss")private Date createTime;// Getters and Setters
}

读取 Excel 文件代码示例:

java">import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;public class ExcelReadExample {public static void main(String[] args) {String fileName = "user_data.xlsx";EasyExcel.read(fileName, UserData.class, new AnalysisEventListener<UserData>() {private List<UserData> dataList = new ArrayList<>();@Overridepublic void invoke(UserData data, AnalysisContext context) {dataList.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// Process the dataList or persist it to the databasedataList.forEach(System.out::println);}}).sheet().doRead();}
}

3. 业务开发示例

让我们通过一个实际的业务场景来展示 EasyExcel 的应用。例如,假设我们需要处理一个用户数据的导入导出功能,其中包括从 Excel 文件中读取用户数据并保存到数据库中,或将数据库中的用户数据导出到 Excel 文件中。

3.1 用户数据导出

我们需要从数据库中获取用户数据,然后将其导出到 Excel 文件中。假设我们有一个用户服务类 UserService 和对应的数据库访问层 UserRepository

用户数据服务:

java">import java.util.List;public interface UserService {List<UserData> getAllUsers();
}

用户数据实现:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserRepository userRepository;@Overridepublic List<UserData> getAllUsers() {return userRepository.findAll();}
}

导出功能实现:

java">import com.alibaba.excel.EasyExcel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class UserDataExporter {@Autowiredprivate UserService userService;public void exportUserData() {List<UserData> users = userService.getAllUsers();String fileName = "exported_user_data.xlsx";EasyExcel.write(fileName, UserData.class).sheet("用户数据").doWrite(users);}
}
3.2 用户数据导入

同样,我们需要实现一个从 Excel 文件中读取用户数据并保存到数据库中的功能。

导入功能实现:

java">import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.event.AnalysisEventListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class UserDataImporter {@Autowiredprivate UserService userService;public void importUserData(String fileName) {EasyExcel.read(fileName, UserData.class, new AnalysisEventListener<UserData>() {@Overridepublic void invoke(UserData userData, AnalysisContext context) {// Save user data to the databaseuserService.save(userData);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// Optional: Log completion or further processing}}).sheet().doRead();}
}

4. 进阶用法

除了基本的读写功能,EasyExcel 还提供了一些进阶用法,例如支持不同的数据格式、自定义转换器等。

4.1 自定义转换器

我们可以实现自定义转换器来处理特殊的数据格式,例如将日期格式化为特定的字符串格式。

自定义日期格式转换器:

java">import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.DateUtils;
import java.util.Date;public class CustomDateConverter implements Converter<Date> {@Overridepublic Class supportJavaTypeKey() {return Date.class;}@Overridepublic CellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {// Format the date as a stringString formattedDate = DateUtils.formatDate(value, "yyyy-MM-dd");return new CellData<>(formattedDate);}@Overridepublic Date convertToJavaData(CellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {// Parse the date string back to Date objectreturn DateUtils.parseDate(cellData.getStringValue(), "yyyy-MM-dd");}
}

在数据模型中使用自定义转换器:

java">import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;public class UserData {@ExcelProperty("用户ID")private Long id;@ExcelProperty("用户姓名")private String name;@ExcelProperty("创建时间")@DateTimeFormat("yyyy-MM-dd")private Date createTime;// Getters and Setters
}
4.2 自定义格式

基础概念

在 EasyExcel 中,设置单元格格式主要涉及以下几个类和接口:

  • WriteCellStyle:用于定义写操作中的单元格样式。
  • ReadCellStyle:用于定义读操作中的单元格样式。
  • AbstractCellStyleStrategy:抽象类,通过继承这个类可以实现自定义的单元格样式策略。

自定义单元格格式示例

以下是一个如何设置单元格字体、颜色和边框的示例。我们将创建一个自定义的 AbstractCellStyleStrategy,来定义写入 Excel 文件时的单元格样式。

java">import com.alibaba.excel.write.style.AbstractCellStyleStrategy;
import com.alibaba.excel.write.style.cell.WriteCellStyle;
import org.apache.poi.ss.usermodel.*;public class CustomCellStyleStrategy extends AbstractCellStyleStrategy {private final WriteCellStyle writeCellStyle;public CustomCellStyleStrategy() {// 初始化 WriteCellStylethis.writeCellStyle = new WriteCellStyle();Font font = writeCellStyle.getFont();font.setFontName("Arial");font.setFontHeightInPoints((short) 12);font.setColor(IndexedColors.BLUE.getIndex());CellStyle cellStyle = writeCellStyle.getCellStyle();cellStyle.setFont(font);cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());}@Overrideprotected void initCellStyle(CellStyle cellStyle, CellData cellData) {// Apply custom cell stylecellStyle.cloneStyleFrom(this.writeCellStyle.getCellStyle());}
}

使用自定义单元格格式

在编写 Excel 文件时,将自定义单元格格式应用到数据写入的过程中。以下代码演示如何使用 CustomCellStyleStrategy 来设置 Excel 文件的样式。

java">import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;import java.util.Arrays;
import java.util.List;public class EasyExcelDemo {public static void main(String[] args) {// 创建数据List<List<String>> data = Arrays.asList(Arrays.asList("Name", "Age", "City"),Arrays.asList("Alice", "30", "New York"),Arrays.asList("Bob", "25", "Los Angeles"));// 创建 ExcelWriterExcelWriterBuilder writerBuilder = EasyExcel.write("demo.xlsx");writerBuilder.registerWriteHandler(new CustomCellStyleStrategy());// 创建 SheetWriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();// 写入数据EasyExcel.write("demo.xlsx").registerWriteHandler(new CustomCellStyleStrategy()).sheet("Sheet1").doWrite(data);}
}

业务开发示例

在实际业务开发中,自定义单元格格式可能用于以下场景:

  • 财务报表:需要突出显示特定的数值或计算结果(例如,利润或亏损)。
  • 数据导出:生成的报告需要特定的格式以便于阅读和分析。
  • 统计报告:数据表格中的不同部分需要不同的样式以区分重要信息。

例如,在财务报表中,可以通过不同颜色突出显示负数和正数。或在销售数据中,通过字体加粗来标记重点销售人员。

java">public class FinancialReportCellStyleStrategy extends AbstractCellStyleStrategy {@Overrideprotected void initCellStyle(CellStyle cellStyle, CellData cellData) {if (cellData.getStringValue().startsWith("-")) {cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());} else {cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());}cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);}
}

http://www.ppmy.cn/ops/97353.html

相关文章

【x265】x265编码器参数配置

目录 1. 默认配置2. 档位配置&#xff08;preset & tune&#xff09; 在熟悉编码器过程中&#xff0c;一个比较有效的方法是了解其配置参数&#xff0c;根据其配置参数就可以知道编码器使用了哪些工具&#xff0c;从中筛选出重要的工具重点看看。本文记录一下x265编码器中的…

TPM管理培训值不值得去?

TPM管理培训是否值得去&#xff0c;取决于多个因素&#xff0c;包括个人职业发展需求、所在企业的情况以及培训内容和质量等&#xff0c;具体如深圳TPM管理咨询公司下文所述&#xff1a; 一、个人职业发展需求 - 从事设备管理相关工作&#xff1a;如果您的工作涉及设备维护、生…

大数据开发工程师面试整理-数据模型

数据模型是指用于定义和组织数据的结构、关系、约束和操作的形式化表示。在数据库设计和数据管理中,数据模型起着至关重要的作用。常见的数据模型类型包括关系型数据模型、文档型数据模型、键值型数据模型、列族型数据模型和图数据模型等。以下是这些主要数据模型的详细介绍:…

勇闯机器学习(第二关-数据集使用)

以下内容&#xff0c;皆为原创&#xff0c;重在无私分享高质量知识&#xff0c;制作实属不易&#xff0c;请点点关注。 好戏开场了~~~(这关涉及到了加载数据集的代码&#xff0c;下一关&#xff0c;教你们安装机器学习库) 一.数据集 这一关的目标 知道数据集被分为训练集和测…

【实战指南】文心快码(Baidu Comate)帮助小白快速实现项目

1、前言 有一个以前的access数据库&#xff0c;现在有个需求&#xff0c;需要把access数据库中的数据&#xff0c;转存到mysql数据库中&#xff0c;并且将mysql数据库中的数据&#xff0c;显示到页面上&#xff08;本文采用示例数据进行实战&#xff09;&#xff0c;这个需求想…

多平台编译libexif

下载地址&#xff1a;https://github.com/libexif/libexif/releases 1. ubuntu x64 &#xff08;银河麒麟系统aarch64步骤相同&#xff09; # 解压 > tar -jxvf libexif-0.6.24.tar.bz2 > cd libexif-0.6.24 # 配置 > ./configure # 编译 > make # 安装 > mak…

SpringBoot 集成 Netty 作为服务端常用 TCP/UDP 通讯协议示例

文章目录 1 摘要2 通讯协议3 核心代码3.1 Netty 服务器3.2 Netty 服务端工具类3.3 Netty 服务处理器3.4 协议请求头封装类 4 测试4.1 测试工具4.2 测试数据4.2 测试数据 1 摘要 在 IoT 物联网设备通讯领域&#xff0c;服务端和设备端的通讯通常基于 TCP/UDP 协议&#xff0c;在…

基于SpringBoot+Vu e.js校园疫情防控系统的设计与实现

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…