EasyExcel动态映射Excel数据到任意实体类教程

在使用EasyExcel进行Excel导入时,我们经常需要将Excel中的数据映射到Java实体类中。如果Excel的列名是固定的,我们可以通过@ExcelProperty("列名")注解直接在实体类中指定列名。但如果Excel的列名不固定,或者我们希望根据Excel的第一行来动态确定映射关系,我们就需要一种更灵活的方法。本教程将介绍如何使用EasyExcel创建一个工具类,以支持动态映射Excel数据到任意实体类。

步骤1:添加EasyExcel依赖

首先,确保你的项目中已经添加了EasyExcel的依赖。如果使用Maven,可以在pom.xml中添加如下依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.x.x</version> <!-- 使用最新版本 -->
</dependency>

步骤2:创建动态映射工具类

创建一个工具类DynamicExcelUtil,它将负责读取Excel文件,并根据第一行的列名动态映射数据到实体类。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.var;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;public class ExcelUtil {/*** 读取 Excel 文件并返回数据模型列表。** @param fileName Excel 文件的路径。* @param clazz    数据模型类。* @param <T>      数据模型的类型。* @return 数据模型列表。*/public static <T> List<T> readExcel(String fileName, Class<T> clazz) {ExcelDataListener<T> listener = new ExcelDataListener<>();List<T> dataModels = new ArrayList<>();try {EasyExcel.read(fileName, clazz, listener).sheet().doRead();dataModels = listener.getDataModels();} catch (Exception e) {e.printStackTrace();}return dataModels;}/*** Excel 数据读取监听器。** @param <T> 数据模型的类型。*/public static class ExcelDataListener<T> implements ReadListener<T> {private List<T> dataModels = new ArrayList<>();@Overridepublic void invoke(T dataModel, AnalysisContext context) {dataModels.add(dataModel);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 所有数据解析完成后的操作}public List<T> getDataModels() {return dataModels;}}/*** 将 MultipartFile 转换为 File 对象。** @param file MultipartFile 对象。* @return 转换后的 File 对象。* @throws IOException 如果文件写入失败。*/public static File convert(MultipartFile file) throws IOException {if (!file.isEmpty()) {File convFile = new File(Objects.requireNonNull(file.getOriginalFilename()));try (var fos = new FileOutputStream(convFile)) {fos.write(file.getBytes());}return convFile;}throw new IOException("Could not convert the uploaded file.");}}

如果我们现在有一个实体类,如下:

package com.xiaobai.easyexceldemo.domain;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;/*** * @TableName easy_demo*/
@TableName(value ="easy_demo")
@Data
public class EasyDemo implements Serializable {/*** */@TableIdprivate Integer id;/*** */private String name;/*** */private String password;/*** */private String email;/*** */private String qq;/*** */private String address;/*** */private String nameSpace;@TableField(exist = false)private static final long serialVersionUID = 1L;
}

 此时我们我们有一个表格,数据如下:

测试:方式一,直接映射

此时我们映射的时候,需要按照表格的列新创建一个中间类。

@Data
public class EasyDemoDto {/****/private String name;/****/private String password;/****/private String email;/****/private String qq;/****/private String address;/****/private String nameSpace;
}

这个类需要按照表格的列进行按照顺序排列,才可以映射上。

现在我们调换一下(name,password)字段的顺序,看一下结果:

所以直接映射的时候一定要注意,字段和excel表格列顺序一致

测试:方式二,注解映射

在实体中添加注解@ExcelProperty("列名"),映射excel表中的列名,进行映射数据。

@Data
public class EasyDemoDto {/****/@ExcelProperty("密码")private String password;/****/@ExcelProperty("名称")private String name;/****/@ExcelProperty("邮箱")private String email;/****/@ExcelProperty("qq")private String qq;/****/@ExcelProperty("地址")private String address;/****/@ExcelProperty("空间")private String nameSpace;
}

EasyExcel中注解说明 

@ExcelProperty: 用于指定实体类属性与 Excel 列的映射关系。

public class Student {@ExcelProperty("学生姓名")private String name;// 其他属性和getter/setter方法
}

@DateTimeFormat: 用于指定日期时间格式,与@ExcelProperty一起使用。

@ExcelProperty("出生日期")
@DateTimeFormat("yyyy-MM-dd")
private Date birthDate;

@NumberFormat: 用于指定数字格式,与@ExcelProperty一起使用。

@ExcelProperty("分数")
@NumberFormat("#.##")
private double score;

@ColumnWidth: 用于指定列宽。

public class Product {@ExcelProperty("产品名称")@ColumnWidth(20)private String name;// 其他属性和getter/setter方法
}

@ContentFontStyle: 用于定义内容单元格的字体样式。

@ExcelProperty("备注")
@ContentFontStyle(name = "微软雅黑", size = 12, isBold = true)
private String comment;

@ContentLoopMerge: 用于在循环写入时合并单元格。

public class SalesRecord {@ExcelProperty("产品名称")@ContentLoopMerge(startRow = 1, endRow = 3)private String productName;// 其他属性和getter/setter方法
}

@ContentRowHeight: 用于设置内容行高。

@ExcelProperty("详细描述")
@ContentRowHeight(value = 50)
private String description;

@ContentStyle: 用于定义内容单元格的样式。

@ExcelProperty("数值")
@ContentStyle(fillForegroundColor = 3, fillPatternType = FillPatternType.SOLID_FOREGROUND)
private double value;

@HeadFontStyle: 用于定义表头单元格的字体样式。

public class Employee {@ExcelProperty("工号")@HeadFontStyle(name = "宋体", size = 14, isBold = true)private String employeeId;// 其他属性和getter/setter方法
}

@HeadRowHeight: 用于设置表头行高。

@ExcelProperty("姓名")
@HeadRowHeight(value = 30)
private String name;

@HeadStyle: 用于定义表头单元格的样式。

@ExcelProperty("部门")
@HeadStyle(fillForegroundColor = 4, fillPatternType = FillPatternType.SOLID_FOREGROUND)
private String department;

@OnceAbsoluteMerge: 用于绝对合并单元格一次。

public class Summary {@ExcelProperty("总计")@OnceAbsoluteMerge(merge = {@ExcelColIndex(1), @ExcelColIndex(2)}, row = 1)private double total;// 其他属性和getter/setter方法
}

@ExcelIgnore: 用于忽略不映射到 Excel 的实体类属性。

private String internalUseOnly;

@ExcelIgnoreUnannotated: 类级别的注解,指定只有使用了@ExcelProperty注解的字段才会写入 Excel。

@ExcelIgnoreUnannotated
public class Product {private String id;@ExcelProperty("产品名称")private String name;// 只有name属性会写入Excel
}

@ExcelColIndex: 用于指定列的索引。

@ExcelProperty("价格")
@ExcelColIndex(2)
private double price;

至此,已经结束啦,获取有不对的地方,还请提出,共勉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414378.html

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

相关文章

【Unity实战】Visual Studio Debug失败

Visual Studio&#xff0c;就像以前Eclipse在Java领域中的地位一样&#xff0c;至少在Jetbrains人人皆爱之前&#xff0c;它是主流。可能对于当下来说显得臃肿&#xff0c;而且没有Jetbrains智能准确的代码分析提示&#xff0c;但是依旧能用。而且开大工程来说&#xff0c;至少…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用&#xff0c;流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量&#xff0c;Kubernetes 提供了多种解决方案&#xff0c;其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

Jupyter如何使用Anaconda的虚拟环境

Anaconda的虚拟环境大家应该都知道是什么&#xff0c;我们可以建立多个虚拟环境并在对应的环境中安装不同的python三方库从而运行不同的python项目&#xff0c;那么在jupyter中如何使用Anaconda的虚拟环境呢&#xff0c;今天就为大家分享一个这样的操作教程。 请参考图文进行以…

实用好软-----电脑端 开源的视频无损剪切与合并工具

这个是一个开源项目LosslessCut 无损剪切就是基于关键帧的剪切&#xff0c;不需要重编码&#xff0c;因此速度非常快&#xff0c; 缺点就是切割时间无法达到非常精确&#xff0c;可能前后会有几秒的差距&#xff0c; 要做到精确的剪切&#xff0c;只能重编码。 LosslessCut在切…

Junit单元测试入门

目录 一、单元测试 1.1 基本概念 1.2 以往测试存在的问题和不足 二、快速入门 2.1 基本步骤 2.2 基本使用示例&#xff08;vscode为例&#xff09; 2.2 断言机制&#xff08;重要&#xff09; 2.3 其它注解 一、单元测试 1.1 基本概念 针对最小单元的测试&#xff0c…

mysql创建数据库和表

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 一、MySQL数据库和表的基础概念 在深入讲解如何在MySQL中创建数据库和表之前&#xff0c;先了解一些基础概念。 1.1 数据库和表的概念 数据库&#xff08;Database&#xff09;&#xff1a;数据库是数据存…

4-6 使用bios 中断 显示字符

1 显示的逻辑 bios 首先通过中断&#xff0c;访问到 最前面的中断向量表&#xff0c;然后 通过中断向量表然后 访问到具体的 bios 的函数&#xff0c;这些函数是bios 自带的&#xff0c;具体的位置 &#xff0c; 我也不知道。只知道有这个函数。 3 显示的原理 &#xff1b; 主要…

Unity中保存数据的方法

一、概述 Unity中可用于持久化的方式有&#xff1a; 1&#xff09;通过ScriptableObject在可编辑模式下保存数据 2&#xff09;通过excel、json等文件实现数据的可持久化 二、ScriptableObject的使用 1、使用背景 假如需要制作子弹预设体&#xff0c;每个子弹上有speed速…

【国考】特值法

特值法 题干中存在乘除关系&#xff0c;且对应量未知。 例3&#xff1a;甲、乙、丙三个工程队的效率比为6&#xff1a;5&#xff1a;4,现将A、B两项工作量相同的工程交给这三个工程队,甲队负责A工程,乙队负责B工程,丙队参与A工程若干天后转而参与B工程.两项工程同时开工,耗时16…

两个月冲刺软考——求解关系模式达到了第几范式题型(例题+讲解,一看就会)

目录 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该是将“一”的那一方的主键加入到“多”的一方的关系模式中。 2.求解关系模式达到了第几范式题型 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该…

利用session.upload_progress执行文件包含

1.session.upload_progress的作用&#xff1a; session.upload_progress最初是PHP为上传进度条设计的一个功能&#xff0c;在上传文件较大的情况下&#xff0c;PHP将进行流式上传&#xff0c;并将进度信息放在Session中&#xff08;包含用户可控的值&#xff09;&#xff0c;即…

excel透视图、看板案例(超详细)

一、简介 Excel透视图&#xff08;Pivot Table&#xff09; 功能&#xff1a;透视图是一种强大的数据分析工具&#xff0c;用于汇总、分析和展示数据。它允许用户对数据进行重新排列和分类&#xff0c;从而更容易发现数据中的模式和趋势。用途&#xff1a;可以用来生成动态报表…

GIT 下载安装使用教程

目录 一. GIT 下载 二. GIT 安装 1. 许可声明 2. 选择安装路径 3. 组件选择 4. 开始菜单文件夹 5. Git使用的默认编辑器 6. 调整新存储库中初始分支的名称 7. 调整Path环境 8. 选择SSH可执行文件 9. 选择HTTPS传输后端 10. 配置行结束转换 11. 配置用于Git Bash的终端模…

Spring之配置类解析源码解析

解析配置类 解析配置类流程图&#xff1a;https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd 解析配置类思维脑图&#xff1a;https://www.processon.com/view/link/614c83cae0b34d7b342f6d14 在启动Spring时&#xff0c;需要传入一个AppConfig.class给Appli…

企业级使用docker实现负载均衡

利用Docker容器编排完成haproxy和nginx负载均衡架构实施 利用 Docker 编排实现 HAProxy 和 Nginx 负载均衡架构的介绍&#xff1a; 首先&#xff0c;使用 Docker Compose 进行容器编排。创建一个 haproxy.yml 文件&#xff0c;定义 HAProxy 和 Nginx 服务。HAProxy 容器作为前…

C语言 | Leetcode C语言题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int firstUniqChar(char* s) {struct hashTable* position NULL;int que[26][2], left 0, right 0;int n strlen(s);for (int i 0; i < n; i) {int ikey s[i];struct has…

基于django+vue+uniapp的摄影竞赛小程序

开发语言&#xff1a;Python框架&#xff1a;djangouniappPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员主界面 教师管理 学…

CSS\JS实现页面背景气泡logo上浮效果

效果图&#xff1a; 单容器显示气泡&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Bu…

测试 UDP 端口可达性的方法

前言&#xff1a; UDP (User Datagram Protocol) 是一种无连接的传输层协议&#xff0c;它不像 TCP 那样提供确认机制来保证数据包的可靠传输。因此&#xff0c;测试 UDP 端口的可达性通常需要一些特殊的方法&#xff0c;因为传统的端口扫描工具&#xff08;如 nmap&#xff0…

linux 上传文件报错 -bash: rz:command not found

linux 上传文件报错 -bash: rz:command not found 新创建的纯净虚拟机无法上传文件安装lrzsz 新创建的纯净虚拟机无法上传文件 这个错误表明系统中没有安装 rz&#xff08;上传文件工具&#xff09;命令。 如果是在 CentOS 或 Red Hat 等基于 RPM 的系统上&#xff0c;可以使用…