一个简单又快速的表格处理库

大家好,我是鱼皮。

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

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

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

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

Easy Excel

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

文档地址:https://www.yuque.com/easyexcel/doc/easyexcel

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

首先在项目中引入 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 上下文*/@Overridepublic 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 更对我的胃口。


好了,是不是很简单了,有兴趣的话自己写个表格处理程序吧~

学到的话,帮鱼皮点个 呗,感谢!

Java 处理表格,也很轻松相关推荐

  1. 一种很轻松的Excel关键字方式进行Android端APP自动化测试(Java+Appium+TestNG+Excel)

    说明 本次分享Android端APP自动化测试Excel执行逻辑,整体逻辑与Web端类似,没看过的读者可看这里 =========>> 一种很轻松的Excel关键字方式进行网页Web自动化 ...

  2. java swing 表格控件_java swing 开发 -JTable

    最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...

  3. 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松

    阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松 一.概述 面试,难还是不难?取决于面试者的底蕴(技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想 ...

  4. 专访黄勇:Java在未来的很长一段时间仍是主流

     专访黄勇:Java在未来的很长一段时间仍是主流 发表于2015-09-06 13:18| 11640次阅读| 来源CSDN| 70 条评论| 作者钱曙光 社区文旦专访黄勇架构框架JavaJava ...

  5. 企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通

    企业微信 for Mac是企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通,企业微信mac最新官方版可以让企业对内外部通讯提高即时效率,同时建立企业信息 ...

  6. Java开发面试题——很有帮助的

    面试题 一.Java 1.运行机制 1)Java跨平台原理 Java实现跨平台是JVM(Java虚拟机)起的作用.如果是C/C++的编译方式,一旦换了一个平台,那么就需要重新编译一份对应的可执行代码, ...

  7. 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜像,即拉即用——daocloud国内镜像加速...

    Docker之所以这么吸引人,除了它的新颖的技术外,围绕官方Registry(Docker Hub)的生态圈也是相当吸引人眼球的地方. 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜 ...

  8. 九零后程序员心塞大哭:“我累的心脏疼,父母却说我工作很轻松”

    "常回家看看,回家看看!把生活的烦恼,跟爸妈说说--" -- 说了之后你会发现,烦恼不但没有消失,反而扩大了一百倍. 小编有个程序员同行,九零后 小吴,前几天就经历了类似的事情. ...

  9. 使您的Java代码闻起来很新鲜

    by Marco Massenzio 由Marco Massenzio 使您的Java代码闻起来很新鲜 (Make your Java code smell nice and fresh) A few ...

最新文章

  1. 谷歌公布GSoC 2020 暑期代码项目名单,200个开源项目30个新增
  2. (zhuan) Recurrent Neural Network
  3. 10、Java Swing JComboBox:下拉列表组件
  4. hadoop job 未跑满资源_Hadoop多用户资源管理–Fair Scheduler介绍与配置
  5. HDU - 5452 Minimum Cut(LCA+树上差分)
  6. wordpress安装及使用
  7. 35. 搜索插入位置 golang
  8. antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
  9. C++ Primer中文版(第4版 特别版)
  10. 开工第一天,这个超时问题把我干趴下了
  11. C#LeetCode刷题之#561-数组拆分 I(Array Partition I)
  12. 使用laypage进行分页
  13. 平面/UI设计师社区网站集设网|让你作品开始发光
  14. Django怎么配置mysql数据库_Django如何配置mysql数据库
  15. stacking模型融合_算法实践七:模型融合
  16. 学前儿童健康教育 复习资料 渝粤题库整理
  17. 美团外卖数据采集接口
  18. 代理模式实例与解析--实例一:论坛权限控制代理
  19. 电脑卡住了怎么保存excel_win7系统遇到死机没及时保存excel文件该怎么办
  20. 如何在计算机中增加字体,电脑如何添加字体?WinXP系统新增个性字体的方法

热门文章

  1. asp.net怎么实现按条件查询_【33期】分别谈谈联合索引生效和失效的条件
  2. jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...
  3. java mvc mvp_MVC和MVP设计模式
  4. 计算机主机外部的连接端口有何作用,微机原理 课后题 标准答案
  5. python批处理代码_【原创源码】【python】python文本文件批处理
  6. ElasticSearch手动创建mapping
  7. MySQL 正则表达式
  8. 中国基金投顾蓝皮书2022
  9. 2021抖音私域经营白皮书
  10. 弹簧触摸开关原理图_两种触摸开关电路