java EasyExcel实现动态列解析和存表

yizhihongxing

Java EasyExcel实现动态列解析和存表

在Java中,EasyExcel是一款非常好用的Excel操作工具。本文将介绍如何使用EasyExcel实现动态列解析和存表。

准备工作

使用EasyExcel需要添加相应的依赖:

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

其中x.x.x为EasyExcel的版本号。

动态列解析

动态列指的是Excel中列数不确定,可能在读取的时候会增加或减少。使用EasyExcel可以很方便地处理这种情况。

在读取Excel时,声明一个用于存放数据的List,声明实体类,并通过EasyExcel的@ExcelProperty注解设置与Excel列的映射关系。当遇到不存在的列时,EasyExcel会自动忽略。

例如,以下的实体类表示一个Excel文件,包含了一个不确定列数的表格。

public class ExcelFile {
   // 文件名
   private String fileName;
   // 表名
   private String sheetName;
   // 表头
   @ExcelProperty(index = 0)
   private List<String> headers;
   // 数据
   @ExcelProperty(index = 1)
   private List<Map<String, String>> data;
   // getter/setter
}

上面的实体类中,headers字段表示表头,类型为Listdata字段表示数据,类型为List>。Map中的key表示列名,value表示对应数据。

通过配置@ExcelProperty注解,EasyExcel可以很方便地将Excel文件中的数据转换成Java对象,并自动忽略不存在的列。

存储Excel数据

EasyExcel还提供了将Java对象写入Excel文件的功能。当我们需要将数据保存为Excel文件时,同样可以使用EasyExcel。

首先声明一个用于存放数据的List,并设置数据的格式。然后通过EasyExcel的write方法将数据保存成Excel文件即可。

以下示例展示如何将一个List>中的数据写入Excel文件。

public void saveExcel(List<Map<String, String>> data, String fileName) {
   // 文件路径
   String filePath = fileName + ".xlsx";
   // 构造ExcelWriter实例
   ExcelWriter writer = EasyExcel.write(filePath).build();
   // 设置Sheet1的表头
   List<String> headers = Arrays.asList("姓名", "年龄", "性别");
   // 构造Sheet实例
   Sheet sheet = new Sheet(1, 0);
   // 设置表头
   sheet.setHead(Collections.singletonList(headers));
   // 写入数据
   writer.write(data, sheet);
   // 关闭资源
   writer.finish();
}

上面的代码中,我们构造了一个ExcelWriter实例并设置了文件路径。然后构造了一个Sheet实例,并在表头中设置了列名。最后通过调用write方法将数据写入Excel文件中。

示例

以下示例展示了如何读取一个Excel文件,并将数据保存为另一个Excel文件。

public void readExcelToSave(String inFilePath, String outFilePath) {
   // 构建ExcelReader实例
   ExcelReader reader = EasyExcel.read(inFilePath).build();
   // 构造解析监听器
   DynamicColumnListener listener = new DynamicColumnListener();
   // 解析Excel
   reader.read(new Sheet(1, 0), listener);
   // 关闭资源
   reader.finish();
   // 在控制台输出数据
   System.out.println(listener.getExcelFile());
   // 写入数据到Excel文件
   saveExcel(listener.getExcelFile().getData(), outFilePath);
}

在上面的代码中,我们首先构建了一个ExcelReader实例并设置了文件路径。然后构造了一个DynamicColumnListener实例,并在调用read方法时传入该实例,用于监听Excel文件解析过程。在解析完成之后,我们将数据通过saveExcel方法保存为另一个Excel文件。

对于DynamicColumnListener的实现,我们需要通过invokeHeadMap方法获取Excel中的列名,然后动态构造实体类。示例如下:

public class DynamicColumnListener extends AnalysisEventListener<Map<Integer, String>> {
   private final ExcelFile excelFile = new ExcelFile();
   private Integer index = 0;
   // 获取表头
   @Override
   public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
       excelFile.setHeaders(new ArrayList<>(headMap.values()));
   }
   // 处理数据
   @Override
   public void invoke(Map<Integer, String> data, AnalysisContext context) {
       // 判断是否是第一行
       if (index == 0) {
           // 动态构造实体类
           List<Field> fields = new ArrayList<>();
           for (String header : excelFile.getHeaders()) {
               Field declaredField = null;
               try {
                   declaredField = ExcelData.class.getDeclaredField(header);
               } catch (NoSuchFieldException e) {
                   // 不存在的列忽略
                   continue;
               }
               declaredField.setAccessible(true);
               fields.add(declaredField);
           }
           excelFile.getExcelData().setFields(fields);
       }
       // 构造数据
       Map<String, String> result = new HashMap<>();
       for (String header : excelFile.getHeaders()) {
           result.put(header, data.get(excelFile.getHeaders().indexOf(header)));
       }
       excelFile.getExcelData().getData().add(result);
       index++;
   }
   // 获取ExcelFile实例
   public ExcelFile getExcelFile() {
       return excelFile;
   }
   // 在解析完成后执行
   @Override
   public void doAfterAllAnalysed(AnalysisContext context) {}
}

在上面代码的invokeHeadMap方法中,我们获取到Excel文件的列名并将其存入到ExcelFile对象中。在invoke方法中,我们动态构造实体类,并将解析出来的数据存储到ExcelFile对象中。在解析完成之后,通过getExcelFile方法获取到ExcelFile对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java EasyExcel实现动态列解析和存表 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • C语言中结构体(struct)的几种初始化方法

    以下是C语言中结构体(struct)的几种初始化方法的详细讲解。 一、结构体概述 结构体是C语言中一种用户定义类型,允许用户将不同的数据类型组合在一起,形成一个自定义的类型。结构体可以包含不同类型的数据,如整型、浮点型、字符型、数组和其他结构体等。在C语言中,可以使用struct关键字来定义结构体。 结构体定义可以写在函数内部,也可以写在函数外部。定义在函数…

    other 2023年6月20日
    00
  • 浅谈tudou土豆网首页图片延迟加载的效果

    下面是关于“浅谈tudou土豆网首页图片延迟加载的效果”的完整攻略: 一、什么是图片延迟加载? 图片延迟加载(也称为“懒加载”)是一种优化网站加载速度的技术,它可以使图片在用户滚动到它们所在的位置时再进行加载,而不是一次性加载所有图片。这样可以减少页面的加载时间和带宽使用,提高用户体验。 二、tudou土豆网首页图片延迟加载的实现方法 tudou土豆网的首页…

    other 2023年6月25日
    00
  • 乐视手机卡顿怎么办?新技能Get让你的乐视手机顺畅自如

    乐视手机卡顿解决攻略 随着乐视手机市场份额逐渐扩大,不少用户使用乐视手机出现了卡顿现象,严重影响使用体验。本篇文章将详细介绍如何解决乐视手机卡顿问题,让你的手机顺畅自如。 步骤 1:清空应用缓存和数据 清空应用缓存和数据是解决乐视手机卡顿问题的一种有效方式。 示例: 打开手机的“设置”; 进入“应用管理”; 选择需要清空缓存和数据的应用; 选择“存储空间”;…

    other 2023年6月26日
    00
  • vmwareworkstationpro15forwindows下载与安装

    VMware Workstation Pro 15 for Windows 下载与安装 VMware Workstation Pro是一款功能强大的虚拟机软件,其能够在一台物理计算机上运行多个虚拟机操作系统,并且这些操作系统可以在一个页面通过电脑内存来交替运行。在本文中,我们将介绍如何下载 VMware Workstation Pro 15 for Wind…

    其他 2023年3月29日
    00
  • Shell脚本实现从文件夹中递归复制文件

    想要实现从一个文件夹中递归复制(包括文件夹和子文件夹中的文件)文件,可以通过编写Shell脚本来实现。具体的实现攻略如下: 1. 创建Shell脚本文件 在Linux环境中,右键点击文件夹空白处,选择“打开终端”,在终端中输入以下命令来创建一个新的Shell脚本文件: touch myscript.sh 其中,myscript.sh 是你新建的Shell脚本…

    other 2023年6月27日
    00
  • SpringBoot配置文件中系统环境变量存在特殊字符的处理方式

    当Spring Boot配置文件中的系统环境变量(通常以${}形式表示)包含特殊字符时,需要进行处理。常见的两种特殊字符是冒号(:)和横线(-)。这些字符在Spring Boot配置文件中具有特殊含义,而在环境变量中也有可能出现。以下是处理这些特殊字符的几种方法: 方法1:使用反斜线转义特殊字符 可以在特殊字符前面加上反斜线(\)来转义它们。例如,如果配置文…

    other 2023年6月27日
    00
  • php 实现账号不能同时登陆的方法分析【当其它地方登陆时,当前账号失效】

    实现账号不能同时登录的方法可以通过以下几个步骤来实现: 1. 给用户添加一个会话标识 在用户登录成功后,我们可以给当前用户添加一个会话标识,例如一个token,用来记录当前用户的会话状态。 2. 在用户登录时检查会话标识 在用户登录时,我们需要先检查当前用户是否已经有会话标识了,如果已经有了,则表示当前用户已经登录了。我们可以进行一些处理,例如提示用户当前账…

    other 2023年6月27日
    00
  • 手机驱动

    手机驱动攻略 什么是手机驱动? 手机驱动是一种软件,它允许操作系统与手机硬件之间进行通信和交互。手机驱动通常由手机制造商提供,用于确保操作系统能够正确地识别和使用手机的各种功能和硬件组件。 手机驱动的安装步骤 以下是安装手机驱动的一般步骤: 确定手机型号:在安装手机驱动之前,您需要确定您的手机型号和制造商。这通常可以在手机的设置菜单中找到,或者您可以查看手机…

    other 2023年8月4日
    00
合作推广
合作推广
分享本页
返回顶部