你还在用原生 poi 处理 excel?太麻烦了来瞧瞧这个 ~

本贴最后更新于 1320 天前,其中的信息可能已经时移世改

1、easypoi

  1. 前言

excel在日常工作中经常被用来存储用例信息,是一种非常便捷的数据存储工具有着众多的优点,我们就不一一介绍了。

今天来讲讲java操作excel,总所周知java是世界上最好的语言(不容反驳),操作一个excel肯定是不在话下,咱们熟知的POI,Apache大佬出品的一款非常强大的office软件操作包。虽然POI强大,但是代码相对比较繁琐,在当前python引领的大潮下,简化代码势在必行。

那么如何简化代码呢?其实这些事情早就已经有人帮我们想好和做好了,比如阿里巴巴的easyexcel,和我们今天的主角esaypoi都是非常好的解决方案。那为什么选择easypoi而不是阿里的easyexcel呢,当然是easypoi的读写导入和导出更加简单。接下来大家就跟随着我一起慢慢揭开easypoi的神秘面纱。

  1. 简介

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员
就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板。

官网:https://opensource.afterturn.cn/doc/easypoi.html

  1. maven坐标
<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-annotation</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>cn.afterturn</groupId>
	<artifactId>easypoi-base</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>5.2.4.Final</version>
</dependency>

<dependency>
	<groupId>javax.el</groupId>
	<artifactId>javax.el-api</artifactId>
	<version>2.2.4</version>
</dependency>
  1. 最简单的导入

完成最简单的导入,只需要两步:一使用注解配置实体类,二调用工具类。

实体类(省略get/set方法)

public class API implements Serializable {

	@Excel(name = "接口名称")
	private String name;
	@Excel(name = "接口编号")
	private String id;
	@Excel(name = "接口提交方式")
	private String type;
	@Excel(name = "接口地址")
	private String url;
	@Excel(name = "参数类型")
	private String contentType;

@Excel(name = "接口名称")这个注解是啥意思呢?name属性表示excel表头。如图:

image.png

当我们导入excel时,就会按照@Excel注解的映射关系封装API实体类。

工具类

FileInputStream fis = new FileInputStream(EXCEL_PATH);
//导入参数设置类
ImportParams params = new ImportParams();
List<API> importExcel = ExcelImportUtil.importExcel(fis, API.class, params);

总共三行代码,第一行加载excel文件,第二行设置导入参数,第三行根据导入参数返回对应结果并封装成List集合。这三个代码中主要讲解第二行和第三行,第二行是导入参数设置,它能给我们提供什么设置呢?
参考下表:

属性 类型 默认值 功能
titleRows int 0 表格标题行数,默认0
headRows int 1 表头行数,默认1
startRows int 0 字段真正值和列标题之间的距离 默认0
keyIndex int 0 主键设置,如何这个cell没有值,就跳过 或者认为这个是list的下面的值这一列必须有值,不然认为这列为无效数据
startSheetIndex int 0 开始读取的sheet位置,默认为0
sheetNum int 1 上传表格需要读取的sheet 数量,默认为1
needSave boolean false 是否需要保存上传的Excel
needVerfiy boolean false 是否需要校验上传的Excel
saveUrl String "upload/excelUpload" 保存上传的Excel目录,默认是 如 TestEntity这个类保存路径就是 upload/excelUpload/Test/yyyyMMddHHmss****** 保存名称上传时间*五位随机数
verifyHanlder IExcelVerifyHandler null 校验处理接口,自定义校验
lastOfInvalidRow int 0 最后的无效行数,不读的行数
readRows int 0 手动控制读取的行数
importFields String[] null 导入时校验数据模板,是不是正确的Excel
keyMark String ":" Key-Value 读取标记,以这个为Key,后面一个Cell 为Value,多个改为ArrayList
readSingleCell boolean false 按照Key-Value 规则读取全局扫描Excel,但是跳过List读取范围提升性能 仅仅支持titleRows + headRows + startRows 以及 lastOfInvalidRow
dataHanlder IExcelDataHandler null 数据处理接口,以此为主,replace,format都在这后面

对照完这张表之后,你会发现即使我们不对ImportParams做任何设置,也会有对应的默认值。那么第二句代码就能翻译成:读取第一个Sheet且只读取第一个,表头是Sheet的第一行且只有一行。最终我们就能得到第一个Sheet中每一行数据,并且每一行被封装成了API对象也就是一个List。有了这个集合之后我们需要导入的数据就能任由我们如何处理了,是不是很简单。

  1. 最简单的导出
List<API> list = new ArrayList<API>();
ExportParams exportParams = new ExportParams();
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, API.class, list);
workbook.write(new FileOutputStream(EXCEL_PATH));

导出也只有四句代码。第一句是需要导出的数据集合,第二句导出参数,第三句获取导出workbook对象,第四句通过输出流导出数据到excel中。其中第二句也是有很多设置的,我们就用默认设置也能是导出的。第三句也要用到API实体类中的注解映射关系。

  1. 最后

通过esaypoi我们能够使用最少的代码完成基本的导入和导出,基本上能够应对实际工作中80%的需求了,如果需要对excel修改的话,目前来说市面上的工具包都做的不太简单,所以还是需要通过编写原生poi代码完成,如果你需要修改excel的代码可以留言哦~

1 操作
luojie 在 2020-08-06 17:23:18 更新了该帖
1 回帖
请输入回帖内容 ...