在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel、csv、xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的,比如各种各样的报表文件,往往是一些复杂的表格结构,其中不仅有我们需要的数据,还有一些冗余的、无价值的数据,这时我们就无法直接用一般数据加载工具直接读取入库了。也许你会想,数据源导出文件前先处理好数据就行了。然而,实际开发中数据源往往是多个的,而且涉及到不同的部门甚至公司,这其间难免会出现各种麻烦,甚至有些数据文件还是纯手工处理的,不一定能给到你满意的数据格式。所以我们不讨论谁该负责转换的问题,这里主要介绍如何使用Apache POI
来从Excel数据文件中读取我们想要的数据,以及用Bean Validation
对数据内容按照预定的规则进行校验。
文章要点:
- Apache POI是什么
- 如何使用Apache POI读取Excel文件
- 使用Bean Validation进行数据校验
- Excel读取工具类
- 使用实例
Apache POI是什么
Apache POI
是用Java编写的免费开源的跨平台的Java API,提供API给Java程式对Microsoft Office格式档案进行读和写的操作。
如何使用Apache POI处理Excel文件
1、导入Maven依赖
1 | <dependency> |
2、创建Workbook实例
这里需要注意的是Excel文档的版本问题,Excel2003及以前版本的文档使用HSSFWorkbook对象,Excel2007及之后版本使用HSSFWorkbook对象1
2
3
4// Excel2003及以前版本
Workbook workbook = new XSSFWorkbook(new FileInputStream(path));
// Excel2007及之后版本
Workbook workbook = new HSSFWorkbook(new FileInputStream(path));
3、获取Sheet表格页对象
Sheet是Excel文档中的工作簿即表格页面,读取前要先找到数据所在页面,可以通过标签名或者索引的方式获取指定Sheet对象1
2
3
4// 按索引获取
Sheet sheet = workbook.getSheetAt(index);
// 按标签名获取
Sheet sheet = workbook.getSheet(label);
4、获取Cell单元格对象
1 | // 行索引row和列索引col都是以 0 起始 |
5、获取单元格内容
获取单元格的值之前首先要获知单元格内容的类型,在Excel中单元格有6种类型:
- CELL_TYPE_BLANK :空值
- CELL_TYPE_BOOLEAN :布尔型
- CELL_TYPE_ERROR : 错误
- CELL_TYPE_FORMULA :公式型
- CELL_TYPE_STRING:字符串型
- CELL_TYPE_NUMERIC:数值型
各种类型的内容还需要进一步判断其数据格式,例如单元格的Type为CELL_TYPE_NUMERIC时,它有可能是Date类型,在Excel中的Date类型是以Double类型的数字存储的,不同类型的值要调用cell对象相应的方法去获取,具体情况具体分析
1 | public Object getCellValue(Cell cell) { |
6、关闭Workbook对象
1 | workbook.close(); |
使用Bean Validation进行数据校验
当你要处理一个业务逻辑时,数据校验是你不得不考虑和面对的事情,程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的或者符合预定义的格式,一个Java程序一般是分层设计的,而不同的层可能是不同的开发人员来完成,这样就很容易出现不同的层重复进行数据验证逻辑,导致代码冗余等问题。为了避免这样的情况发生,最好是将验证逻辑与相应的模型进行绑定。
Bean Validation
规范的目标就是避免多层验证的重复性,它提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能,从而使验证逻辑从业务代码中分离出来。
Hibernate Validator
是 Bean Validation
规范的参考实现,我们可以用它来实现数据验证逻辑,其Maven依赖如下:1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
关于Bean Validation的详细介绍可参考以下文章:
JSR 303 - Bean Validation 介绍及最佳实践
Bean Validation 技术规范特性概述
Excel读取工具类
我们要达到的效果是,模拟游标
的方式构建一个Excel读取工具类ExcelReadHelper
,然后加载Excel文件流来创建工具类实例,通过这个实例我们可以像游标一样设置当前的行和列,定好位置之后读取出单元格的值并进行校验,完成对Excel文件的读取校验操作。既然是读取还有校验数据,异常处理和提示当然是至关重要的,所以还要有人性化的异常处理方式,方便程序使用者发现Excel中格式或内容有误的地方,具体到哪一行哪一项,出现的问题是什么。
ExcelReadHelper工具类主体
1 | public class ExcelReadHelper { |
ExcelException异常类
1 | public class ExcelException extends Exception { |
使用实例
1 | // 使用Excel文件对象初始化ExcelReadHelper |
本文为作者kMacro原创,转载请注明来源:https://zkhdev.github.io/2018/10/14/java-dev6/