Java处理表格的实用工具库

 更新时间:2021年11月25日 10:24:25   作者:程序员鱼皮  
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,在尽可能节约内存的情况下支持读写百M的Excel,下面这篇文章主要给大家分享介绍了一个关于Java处理表格的实用工具库,需要的朋友可以参考下

前言

处理 Excel 表格是开发中经常遇到的需求,比如表格合并、筛选表格中的某些行列、修改单元格数据等。

今天给大家分享一个 Java 处理表格的工具库,不需要任何专业知识,拿来就能用,快速又轻松~

可能有同学说了,用 Python 处理表格不是更方便么?为毛用 Java 啊?

当然是因为企业中大部分后台开发用的都是 Java!如果你要搞一个允许用户自主上传 Excel 进行处理的服务,那显然直接用 Java 来实现最方便~

Easy Excel

要介绍的库是阿里的 Easy Excel,简单、省内存的读写 Excel 的开源项目。

文档地址:www.yuque.com/easyexcel/d

直接打开官方文档,就能看到项目的使用说明了:

首先在项目中引入 Easy Excel(版本号以文档中的最新版本号为主):

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

然后进入文档的 快速开始 部分,就可以看到读取和写入表格数据的方法了。

下面让我们以一个实际需求为例,试着使用一下这个库。

需求

假设我们有这样一个 Excel 表格:

如果想要调换 姓名列 和 年龄列 的顺序,应该怎么做呢?

读取表格

首先要读取原始表格中的数据。

Easy Excel 提供了两种读取表格的方式:创建对象的读 和 不创建对象的读 。

创建对象的读

如果你已知整个表格的表头信息,比如列名(比如 “姓名”)和列的数据类型(比如字符串),那么可以创建一个对应的类,用来在 Java 中表示表格的元信息。

比如为上述表格创建 YupiData 类,代码如下:

@Data
public class YupiData {
  // 姓名
  private String name;
  // 年龄
  private Integer age;
  // 出生日期
  private Date bornDate;
}

默认会根据属性的顺序来关联表格列的顺序,比如 name 对应姓名(第 0 列)、age 对应年龄(第 1 列)。

当然,你也可以使用注解的方式来指定每个属性对应的表格列,支持指定下标和列名,代码如下:

@Data
public class YupiData {
  // 强制读取下标为 2 的列(第三列)
  @ExcelProperty(index = 2)
  // 指定接受日期的格式
  @DateTimeFormat("yyyy/MM/dd")
  private Date bornDate;
    
  // 用名字去匹配,不能和其他列重复
  @ExcelProperty("年龄")
  private Integer age;
    
  @ExcelProperty("姓名")
  private String name;
}

定义好了表格数据类,就可以开始读取了,该库非常贴心,提供了 同步 和 异步 两种读取方式。

同步是指一次性读取表格中的所有行,以列表的方式完整返回,再整体去处理。由于这种方式会将数据完整加载到内存中,因此只 适用于表格行数比较少 的情况。代码如下:

/**
 * 同步读取
 */
public void synchronousRead() {
  String fileName = "鱼皮的表格.xlsx";
  // 读取到的数据
  List<YupiData> list = EasyExcel.read(fileName)
  	.head(YupiData.class)
    .sheet()
    .doReadSync();
}

异步方式需要定义一个 监听器 ,每读取一行,就要立即去处理该行数据。这样就不需要将所有数据都加载到内存中,算一行读一行,理论上算完了也可以丢弃。代码如下:

/**
 * 定义监听器
 */ 
public class YupiDataListener 
    implements ReadListener<YupiData> {
  /**
   * 每读一行数据,都会调用一次
   *
   * @param data 一行数据
   * @param context 上下文
   */
  @Override
  public void invoke(YupiData data, AnalysisContext context) {
    // 输出姓名
    System.out.println(data.getName());
  }
}

/**
 * 开始读取
 */
void assynchronousRead() {
  String fileName = "鱼皮的表格.xlsx";
  EasyExcel.read(fileName, YupiData.class,
      new YupiDataListener())
      .sheet()
      .doRead();
}

不创建对象的读

如果事先不清楚表格会有哪些列、类型如何(比如让用户自主上传表格),那么可以使用 不创建对象读 的方式,直接用 Map<Integer, String> 泛型类来接收:

List<Map<Integer, String>> list = EasyExcel
    .read(fileName)
    .sheet()
    .doReadSync();
// Map 的 key 为列下标,value 为单元格的值
for (Map<Integer, String> data : list) {
	... 
}

当然,这种读取方式也同时支持同步和异步,可以根据需求选择方式,灵活的一批!

写入表格

学会读取后,写入表格就更简单了,依然是先定义一个类,用来表示要写入表格的元信息(列名、列数据类型等)。

比如要完成表格列顺序调换的需求,定义表格数据类的时候,把 age 和 name 属性的顺序换一下就好了:

@Data
public class YupiWriteData {
  // 年龄 ↑
  private Integer age;
  // 姓名 ↓
  private String name;
  // 出生日期
  private Date bornDate;
}

然后执行 Easy Excel 的 write 方法,就完事了,代码如下:

void doWrite() {
  // 已读取和处理后的数据列表
  List<YupiWriteData> dataList = xxx;
  String fileName = "result.xlsx";
  EasyExcel.write(fileName, YupiWriteData.class)
      .sheet("工作表1")
      .doWrite(dataList);
}

搞定,是不是贼简单!

除了这个库外,Java 处理 Excel 的库还有很多,比如 Apache POI、Hutool 等,大家可以去试试。但我个人感觉还是 Easy Excel 更对我的胃口。

EasyExcel特点

Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

总结

到此这篇关于Java处理表格实用工具库的文章就介绍到这了,更多相关Java处理表格工具库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于SpringBoot实现用户身份验证工具

    基于SpringBoot实现用户身份验证工具

    这篇文章主要介绍了基于SpringBoot实现的用户身份验证工具,非常不错,具有参考借鉴价值 ,需要的朋友可以参考下
    2018-04-04
  • Java continue break制作简单聊天室程序

    Java continue break制作简单聊天室程序

    这篇文章主要为大家详细介绍了Java continue break制作简单聊天室程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Springcloud微服务架构基础知识解析

    Springcloud微服务架构基础知识解析

    这篇文章主要介绍了Springcloud微服务架构基础知识解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java基本数据类型与对应的包装类(动力节点java学院整理)

    Java基本数据类型与对应的包装类(动力节点java学院整理)

    Java是面向对象的编程语言,包装类的出现更好的体现这一思想,Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 下面通过本文给大家详细介绍,感兴趣的朋友一起学习吧
    2017-04-04
  • java自定义JDBC实现连接池

    java自定义JDBC实现连接池

    本文主要介绍了java自定义JDBC实现连接池,包含实现JDBC连接池以及SQLException 异常的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • JAVA StringBuffer类与StringTokenizer类代码解析

    JAVA StringBuffer类与StringTokenizer类代码解析

    这篇文章主要介绍了JAVA StringBuffer类与StringTokenizer类代码解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java如何输出windows中的全部汉字

    Java如何输出windows中的全部汉字

    这篇文章主要介绍了Java如何输出windows中的全部汉字问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java BoxLayout(盒子布局)布局管理器解析

    Java BoxLayout(盒子布局)布局管理器解析

    这篇文章主要介绍了Java BoxLayout(盒子布局)布局管理器解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java字符串替换排序实例

    java字符串替换排序实例

    这篇文章主要介绍了java字符串替换排序实例,有需要的朋友可以参考一下
    2014-01-01
  • java实现的日期时间转换工具类完整示例

    java实现的日期时间转换工具类完整示例

    这篇文章主要介绍了java实现的日期时间转换工具类,结合完整实例形式分析了java针对日期时间常见的转换、计算、格式化等相关操作与封装技巧,需要的朋友可以参考下
    2019-10-10

最新评论