EasyExcel实现execl导入导出

news/2025/2/14 16:58:52/

引言

在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能,以及一些相关的技巧和注意事项。

环境搭建

在开始之前,我们需要准备好 EasyExcel 的环境。首先,我们需要在项目中引入 EasyExcel 的相关依赖。在本文中,我们使用 Maven 作为依赖管理工具。在 pom.xml 文件中添加以下依赖:

   <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version></dependency>

准备 Excel 文件

在开始编写代码之前,我们需要准备一个包含数据的 Excel 文件,作为导入的示例。确保 Excel 文件的结构和数据与实体类的字段对应。

创建实体类

在使用 EasyExcel 进行导入时,我们需要创建一个与 Excel 数据结构相匹配的实体类。实体类的字段应与 Excel 文件的列对应。使用 @ExcelProperty 注解来标识字段与 Excel 列的映射关系,以及一些其他注解来设置字段的属性。举个例子如下:

 

@AllArgsConstructor
@NoArgsConstructor
@Data
public class OperationLog {//    @JsonFormat(shape = JsonFormat.Shape.STRING)@ExcelProperty(value = "id", converter = StringConverter.class,index = 0)private String id; //日志id@ExcelProperty(value = "操作人",index = 1)private String userCode; //操作人@ExcelProperty(value = "操作ip",index = 2)private String ip; //操作ip@ExcelProperty(value = "操作类型",index = 3)private String type; //操作类型@ExcelProperty(value = "操作名称",index = 4)private String description; //操作名称@ExcelProperty(value = "操作模块",index = 5)private String model; //操作模块@ExcelProperty(value = "操作时间",index = 6)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")@ExcelIgnoreprivate String operationTime; //操作时间@ExcelProperty(value = "操作结果",index = 7)private String result; //操作结果
}

自定义转换器

有时,我们需要对 Excel 中的数据进行特殊处理或转换,以适应实体类的字段类型。EasyExcel 允许我们自定义转换器来实现这个功能。下面是一个示例

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;/*** @program: family-doctor* @author: 阿水* @create: 2023-06-16 20:44**/public class StringConverter implements Converter<String> {@Overridepublic Class<String> supportJavaTypeKey() {return String.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws Exception {return cellData.getStringValue();}@Overridepublic CellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) throws Exception {return new CellData<>(value);}
}

编写导入逻辑

现在我们开始编写导入 Excel 的逻辑。以下是一个示例:

我通过的MongoDB的_id集合查询出来数据写入Excel,readExistingExcelData方法是先读取之前再写入,好像没法直接追加 我目前如此操作 也可以完美实现后续添加~

/*** 根据ids批量导出* @param ids* @return*/@Overridepublic HttpResult<?> batchExportLogByIds(List<String> ids) {Query query = new Query(Criteria.where("_id").in(ids));List<OperationLog> resultList = mongoTemplate.find(query, OperationLog.class);// 读取已有的Excel文件内容List<OperationLog> existingList = readExistingExcelData();// 合并新数据和已有数据List<OperationLog> mergedList = new ArrayList<>(existingList);mergedList.addAll(resultList);// 设置写入文件夹地址和Excel文件名称String filename = "F:\\lps\\write.xlsx";ExcelWriter excelWriter = null;try {excelWriter = EasyExcel.write(filename, OperationLog.class).registerConverter(new StringConverter()).build();WriteSheet writeSheet = EasyExcel.writerSheet("日志").build();excelWriter.write(mergedList, writeSheet);} catch (Exception e) {e.printStackTrace();return new HttpResult<>().fail();} finally {if (excelWriter != null) {excelWriter.finish();}}return new HttpResult<>().ok();}// 读取已有的Excel文件内容private List<OperationLog> readExistingExcelData() {String filename = "F:\\lps\\write.xlsx";List<OperationLog> existingList = new ArrayList<>();try {ExcelReader excelReader = EasyExcel.read(filename, OperationLog.class, new OperationLogDataListener(existingList)).build();ReadSheet readSheet = EasyExcel.readSheet("日志").build();excelReader.read(readSheet);excelReader.finish();} catch (Exception e) {e.printStackTrace();}return existingList;}// 自定义监听器private class OperationLogDataListener extends AnalysisEventListener<OperationLog> {private List<OperationLog> dataList;public OperationLogDataListener(List<OperationLog> dataList) {this.dataList = dataList;}@Overridepublic void invoke(OperationLog operationLog, AnalysisContext analysisContext) {dataList.add(operationLog);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 数据处理完毕后的操作(如果需要)}}

 

总结和展望

通过使用 EasyExcel,我们可以轻松实现 Excel 导入功能,并对导入的数据进行处理和转换。本文介绍了如何准备环境、创建实体类、自定义转换器以及编写导入逻辑的步骤和示例代码。希望本文对你理解和使用 EasyExcel 有所帮助。

在实际开发中,还可以进一步扩展功能,例如处理大数据量的导入、导入进度条的展示等。通过深入研究 EasyExcel 的文档和示例代码,你可以发现更多有趣和有用的功能。


http://www.ppmy.cn/news/425972.html

相关文章

Java SSM框架面试题

sql 中 ${} 和 #{}的区别&#xff1a; #将传入的参数都当成一个字符串&#xff0c;会对自动传入的数据加一个双引号。如&#xff1a;order by #{age}&#xff0c;如果传入的值是18,那么解析成sql时的值为order by “18”, 如果传入 age ,则会解析为 order by “age”将传入的参…

运算符优先级/模板字符串/类型转换

1. 运算符优先级 优先级顺序1()2 -- !3先 * / % 后 -4> > < <5 ! !6先&& 后 ||7 2. 模板字符串中输入变量 模板字符串中可换行&#xff0c;变量放在${}中 3. 数据转换 为什么需要转换&#xff1f; 使用表单&#xff0c;prompt 获取过来的数据默认…

C语言之指针详解(8)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指针和数组笔试题解析 #include<stdio.h> int main() {//一维数组int a[] { 1,2,…

Docker容器---Harbor私有仓库部署与管理

Harbor私有仓库部署与管理 一、Harbor概述二、Harbor特性三、Harbor构成四、Harbor构建Docker私有仓库1、部署docker-compos2、下载或上传 Harbor 安装程序3、启动Harbor4、查看Harbor启动镜像5、浏览器访问创建一个新项目6、通过127.0.0.1来登录和推送镜像7、在客户端上传镜像…

Docker容器之harbor私有仓库部署与管理

目录 引言 一、Harbor概述 二、Harbor特性 三、Harbor的构成 四、Harbor构建Docker私有仓库 1、环境配置 2、案例需求 3、部署Harbor服务 4、物理机访问server IP 5、添加项目并填写项目名称 6、通过127.0.0.1来登陆和推送镜像 7、其他客户端上传镜像到Harbor …

Docker harbor私有仓库部署与管理

Docker harbor私有仓库部署与管理 Docker harbor私有仓库部署与管理一、Docker 私有仓库1、下载registry镜像2、修改配置文件/etc/docker/daemon.json &#xff0c;添加私有仓库配置&#xff0c;修改完后重启docker3、创建私有仓库容器4、推送镜像到私有仓库中5、查看当前仓库的…

电力系统潮流计算牛顿法

&#xff08;二&#xff09;牛顿迭代法 一元函数&#xff1a;设非线性函数 f ( x ) 0 f\left( x \right) 0 f(x)0 &#xff0c;对它做泰勒展开&#xff1a; f ( x ( 0 ) Δ x ( 0 ) ) f ( x ( 0 ) ) f ′ ( x ( 0 ) ) Δ x ( 0 ) ⋯ 0 ⇒ f ( x ( 0 ) ) f ′ ( x ( 0 )…

如何通过GPS结合UWB技术实现车载监控精准定位?

目前由青犀视频团队研发的TSINGSEE车载监控平台采用移动视频监控技术、4G/5G无线通信传输技术、大容量数据存储技术、GPS/UWB车辆定位追踪技术、混合联网传输技术、GIS可视化操作技术&#xff0c;形成一套针对所有管辖车辆进行精确监控的综合监管平台&#xff0c;为车辆指挥调度…