Java 处理表格,真的很爽!
一个简单又快速的表格处理库
大家好,我是鱼皮。
处理 Excel 表格是开发中经常遇到的需求,比如表格合并、筛选表格中的某些行列、修改单元格数据等。
今天给大家分享一个 Java 处理表格的工具库,不需要任何专业知识,拿来就能用,快速又轻松~

可能有同学说了,用 Python 处理表格不是更方便么?为毛用 Java 啊?
当然是因为企业中大部分后台开发用的都是 Java!如果你要搞一个允许用户自主上传 Excel 进行处理的服务,那显然直接用 Java 来实现最方便~

Easy Excel
要介绍的库是阿里的 Easy Excel,简单、省内存的读写 Excel 的开源项目。
直接打开官方文档,就能看到项目的使用说明了:

首先在项目中引入 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 更对我的胃口。
好了,是不是很简单了,有兴趣的话自己写个表格处理程序吧~
学到的话,帮鱼皮点个 赞 呗,感谢!

Java 处理表格,真的很爽!的更多相关文章
- 值得推荐的C/C++框架和库 (真的很强大) c
http://m.blog.csdn.net/mfcing/article/details/49001887 值得推荐的C/C++框架和库 (真的很强大) 发表于2015/10/9 21:13:14 ...
- 【转】 值得推荐的C/C++框架和库 (真的很强大)
[转] 值得推荐的C/C++框架和库 (真的很强大) 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个 ...
- 【原创】这道Java基础题真的有坑!我也没想到还有续集。
前情回顾 自从我上次发了<这道Java基础题真的有坑!我求求你,认真思考后再回答.>这篇文章后.我通过这样的一个行文结构: 解析了小马哥出的这道题,让大家明白了这题的坑在哪里,这题背后隐藏 ...
- MySQL开发篇,存储引擎的选择真的很重要吗?
前言 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多,自己 ...
- 常用的sublime text插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
- 很多事情就像看A片,看的人觉得很爽,做的人未必。
http://m.jingdianju.com/wzgs/shenghuo/201307185135.html 转载自: 从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份工作 ...
- 这一次,VR离我们真的很近
从高考作文开始 今年号称是VR元年,虽然目前VR还没能像手机一样走进千家万户,但关于VR设备的关讨论是层出不穷.而今年高考,浙江省的作文题就与VR相关.网上购物.视频聊天等在 ...
- java8实战一------解决冗杂,java8真的很便利(抛砖)
你的代码很容易因为需求而变化,对自己代码改来改去的你一定会觉得烦的.在我看来,java8很容易的解决了这个问题. 先来看看例子!在一堆苹果里,筛选绿色的苹果.当然,Apple类是这样子. class ...
- 常用的sublime text 3插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
随机推荐
- iOS自定义拍照框拍照&裁剪(一)
卡片机时代 很重要的一点是,相机本身是没有方向概念的,它不理解拍摄的内容,只会以相机自己的坐标系去保存数据,下图展示了相机对"F"进行四个角度拍摄时返回的图片数据. 最初的卡片机时 ...
- Java领域的表现层的三种技术--jsp、freemarker、velocity
10月份忙碌的参加秋招并获得了5个成都.上海.广州等不同地区的工作offer,最终选择了广州,11月底来到公司实习,很快,就跟进了公司的项目了,原本以为可以和宣讲会时报的志愿一样--Java开发,但是 ...
- FastAPI 学习之路(二十七)安全校验
你写API接口肯定你是希望是有权限的人才能访问,没有权限的人是不能访问的,那么我们应该如何去处理呢,我们可以用的验证方式有很多,我们这次分享的是用:OAuth2来认证.那么我们看下,需要怎么才能实现呢 ...
- Arthas 进阶教程
Arthas 进阶教程 启动math-game 下载demo-arthas-spring-boot.jar,再用java -jar命令启动: wget https://github.com/hengy ...
- 学大数据一定要会Java开发吗?
Java是目前使用广泛的编程语言之一,具有的众多特性,特别适合作为大数据应用的开发语言.Java语言功能强大和简单易用,不仅吸收了C++语言的各种优点还摒弃了C++里难以理解的多继承.指针等概念. J ...
- Win10 配置JDK1.8 (JDK 8)环境变量
JDK的安装: 1. JDK安装过程中,一般X掉公共JRE,因为JDK包含了JRE: 环境变量的配置: 1. 打开环境变量,编辑系统变量,新建: 变量名:JAVA_HOME 变量值:D:\so ...
- spring security中ajax超时处理
spring security为我们的系统提供了方便的认证和授权操作.在系统中完成认证和授权后,一般页面页面上大多数是ajax和后台进行操作,那么这个时候可能就会面临session超时,ajax去访问 ...
- 关于下载pyton第三方库的细节
1.下载Python第三方库有时候国外的网站网速很不好,需要选择国内的镜像网站去下载 阿里云 http://mirrors.aliyun.com/pypi/simple 中国科技大学 https: ...
- SQLServer聚集索引导致的插入性能低
1,新表默认会在主键上建立聚集索引.对于非专业DBA, 默认配置在大多数情况下够用. 2,当初为了优化查询速度. 把聚集索引建立在非自增主键的唯一索引列. 数据量上千万后,插入性能开始显现不足. 随着 ...
- 从0到1使用Kubernetes系列(五):Kubernetes Scheduling
前述文章介绍了Kubernetes基本介绍,搭建Kubernetes集群所需要的工具,如何安装,如何搭建应用.本篇介绍怎么使用Kubernetes进行资源调度. Kubernetes作为一个容器编排调 ...