Java 处理表格,也很轻松
一个简单又快速的表格处理库
大家好,我是鱼皮。
处理 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 处理表格,也很轻松相关推荐
- 一种很轻松的Excel关键字方式进行Android端APP自动化测试(Java+Appium+TestNG+Excel)
说明 本次分享Android端APP自动化测试Excel执行逻辑,整体逻辑与Web端类似,没看过的读者可看这里 =========>> 一种很轻松的Excel关键字方式进行网页Web自动化 ...
- java swing 表格控件_java swing 开发 -JTable
最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...
- 阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松
阿里P8高级架构师:面试没你想象中的难,拿Offer也可以很轻松 一.概述 面试,难还是不难?取决于面试者的底蕴(技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想 ...
- 专访黄勇:Java在未来的很长一段时间仍是主流
专访黄勇:Java在未来的很长一段时间仍是主流 发表于2015-09-06 13:18| 11640次阅读| 来源CSDN| 70 条评论| 作者钱曙光 社区文旦专访黄勇架构框架JavaJava ...
- 企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通
企业微信 for Mac是企鹅公司为企业与单位推出的一款基于其业务交流平台,该款企业微信mac版可以很轻松的进行企业级沟通,企业微信mac最新官方版可以让企业对内外部通讯提高即时效率,同时建立企业信息 ...
- Java开发面试题——很有帮助的
面试题 一.Java 1.运行机制 1)Java跨平台原理 Java实现跨平台是JVM(Java虚拟机)起的作用.如果是C/C++的编译方式,一旦换了一个平台,那么就需要重新编译一份对应的可执行代码, ...
- 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜像,即拉即用——daocloud国内镜像加速...
Docker之所以这么吸引人,除了它的新颖的技术外,围绕官方Registry(Docker Hub)的生态圈也是相当吸引人眼球的地方. 在Docker Hub上你可以很轻松下载到大量已经容器化的应用镜 ...
- 九零后程序员心塞大哭:“我累的心脏疼,父母却说我工作很轻松”
"常回家看看,回家看看!把生活的烦恼,跟爸妈说说--" -- 说了之后你会发现,烦恼不但没有消失,反而扩大了一百倍. 小编有个程序员同行,九零后 小吴,前几天就经历了类似的事情. ...
- 使您的Java代码闻起来很新鲜
by Marco Massenzio 由Marco Massenzio 使您的Java代码闻起来很新鲜 (Make your Java code smell nice and fresh) A few ...
最新文章
- 谷歌公布GSoC 2020 暑期代码项目名单,200个开源项目30个新增
- (zhuan) Recurrent Neural Network
- 10、Java Swing JComboBox:下拉列表组件
- hadoop job 未跑满资源_Hadoop多用户资源管理–Fair Scheduler介绍与配置
- HDU - 5452 Minimum Cut(LCA+树上差分)
- wordpress安装及使用
- 35. 搜索插入位置 golang
- antd vue form 手动校验_参与《开课吧》vue训练营笔记(Day1)
- C++ Primer中文版(第4版 特别版)
- 开工第一天,这个超时问题把我干趴下了
- C#LeetCode刷题之#561-数组拆分 I(Array Partition I)
- 使用laypage进行分页
- 平面/UI设计师社区网站集设网|让你作品开始发光
- Django怎么配置mysql数据库_Django如何配置mysql数据库
- stacking模型融合_算法实践七:模型融合
- 学前儿童健康教育 复习资料 渝粤题库整理
- 美团外卖数据采集接口
- 代理模式实例与解析--实例一:论坛权限控制代理
- 电脑卡住了怎么保存excel_win7系统遇到死机没及时保存excel文件该怎么办
- 如何在计算机中增加字体,电脑如何添加字体?WinXP系统新增个性字体的方法
热门文章
- asp.net怎么实现按条件查询_【33期】分别谈谈联合索引生效和失效的条件
- jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...
- java mvc mvp_MVC和MVP设计模式
- 计算机主机外部的连接端口有何作用,微机原理 课后题 标准答案
- python批处理代码_【原创源码】【python】python文本文件批处理
- ElasticSearch手动创建mapping
- MySQL 正则表达式
- 中国基金投顾蓝皮书2022
- 2021抖音私域经营白皮书
- 弹簧触摸开关原理图_两种触摸开关电路