EasyExcel实现execl导入导出

引言

在实际开发中,处理 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.hqwc.cn/news/5446.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt for android 开发之tcp通讯

简介 通过TCP使PC和android手机相互通讯。 准备 使用QT的网络模块 QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgets.h 定义TCP接口 #include <QTcpSocket>class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(Q…

计算机中CPU、内存、缓存的关系

CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 内存&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 缓存&#xff08;Cache&#xff09; CPU、内存和缓存之间有着密切的关系&#xff0c;它们共同构成了计算机系统的核…

网络安全进阶学习第五课——文件上传漏洞

文章目录 一、常见文件上传点二、任意文件上传漏洞三、任意文件上传危害四、webshell五、上传木马所需条件六、木马上传流程七、上传绕过1、绕过JS验证1&#xff09;Burpsuite剔除响应JS。2&#xff09;浏览器审计工具剔除JS 2、绕过MIME-Type验证1&#xff09;利用抓包工具&am…

Pytroch本地安装方法

1 查看电脑安装的cuda版本 nvidia-smi这里的红圈标注的是cuda 最高版本&#xff0c;虚拟环境中安装&#xff0c;只要不超过12.0就可以 第二步 去官网看torch, torchvision等版本的匹配关系 https://pytorch.org/get-started/previous-versions/ 比如这里&#xff1a; &…

uniapp项目 封装一个饼图组件 并且修改显示项的排列方式

需求如下: 真实数据渲染后的完成效果如下: 记录一下代码: <template><view><view style"height: 600rpx;"><l-echart ref"chart" finished"init"></l-echart></view></view> </template><…

欧几里得算法

0x00 前言 改补的内容是一点都不会少。本章来看欧几里得算法 0x01 概述 欧几里得算法又称为辗转相除法&#xff0c;指用于计算两个非负整数a和b的最大公约数。 两个整数的最大公约数是能够同时整除他们的最大的正整数。 基本原理&#xff1a;两个整数的最大公约数等于其中…

Springboot整合mybatisplus实战

Springboot整合mybatisplus&#xff0c;纯后端&#xff0c;验证结果是通过postman调用的&#xff0c;记录一下 1、建表语句以及初始化数据脚本 CREATE TABLE tbl_book (id int NOT NULL AUTO_INCREMENT,type varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT…

Binder系列--获取ServiceManager

获取ServiceManager hongxi.zhu 2023-7-1 以SurfaceFlinger为例&#xff0c;分析客户端进程如何获取ServiceManager代理服务对象 主要流程 SurfaceFlinger中获取SM服务 frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp // publish surface flingersp<…

进制转换(十进制与十六进制互转)

之前的一家公司基本上都是基于单片机进行开发&#xff0c;一般与上位机的通信都是按照自定义的协议进行操作&#xff0c;测试的时候会经常都对协议进行修改并且涉及到进制之间的转换&#xff0c;例如获取版本是十六进制的需要转换成十进制的版本信息&#xff0c;例如修改时间需…

主流特征工程平台(一)

一. 目标 对于Feature Store的能力与边界&#xff0c;每家的定义略微不同&#xff0c;《Feature Stores - A Hierarchy of Needs》&#xff09;这篇文章做了很好的总结&#xff0c;大体分为如下几个层次&#xff1a; 特征管理&#xff1a;特征抽取、处理、存储、元数据管理&am…

【复杂网络建模】——使用PyTorch和DGL库实现图神经网络进行链路预测

&#x1f935;‍♂️ 个人主页&#xff1a;Lingxw_w的个人主页 ✍&#x1f3fb;作者简介&#xff1a;计算机科学与技术研究生在读 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4a…

05-Redis初步使用

关系型数据的ACID特性:事务的四大特性:原子性,一致性,隔离性,持久性 关系型数据库应对的三高问题:高并发,高效率,高扩展 关系型数据库和非关系型数据库 关系型数据库的数据存储在表中,无法应对陡增的数据 非关系型数据库使用键值对的方式进行存储数据:redis可以用作缓存 r…