# ExcelUtil
**Repository Path**: yg_cy/ExcelUtil
## Basic Information
- **Project Name**: ExcelUtil
- **Description**: Excel导入工具
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2019-01-19
- **Last Updated**: 2025-04-01
## Categories & Tags
**Categories**: excel-utils
**Tags**: None
## README
# ExcelUtil
#### 介绍
Excel读取组件,V1.0版本
本组件支持读取xlsx与xls两种格式的文件,读取方式可分为两大类一种为规则的,一种为不规则的。
##### 规则的数据
| name | age | birthday |
| -- | -- | -- |
| 张三 | 1 | 2019-01-01 |
| 李四 | 2 | 2018-01-01 |
| 王小二 | 2 | 2018-01-01 |
##### 不规则的数据
| 姓名 | 张三 | 性别 | 男 |
| ------ | ---- | ---- | ---------- |
| 年龄 | 1 | 生日 | 2019-01-01 |
组件通过xml配置文件将表格数据和实体类进行映射,同时提供自定义实现接口和注解两种数据校验方式。
#### 组件UML图

#### 采用技术
1. 采用POI3.16进行对excel的读取
2. 使用xml文件对excel数据信息和相关Bean进行配置
3. 采用反射技术对读取的数据进行封装
4. 使用Hibernate Validator 进行对简单数据类型的注解校验
#### 使用说明
##### 1.引入xml配置文件
一个是公共配置文件Base.xml,主要是配置公共的一些信息;一个对excel文件的xml配置文件,这个文件会引用Base.xml的信息
###### Base.xml
```xml
```
###### 对excel文件的xml配置
```
]>
&Import;
```
###### excel文件的xml配置说明
1. \ 中mode可选 streamMode 或 userMode
一个xml文件只能选择一种模式,当选择streamMode时,只能配置对规则数据的读取。选择userMode时,可同时配置两种类型数据的读取。
2. 一个xml文件中可包含多个bean,一个bean对应一个实体类,一个bean包含多个Item,Item配置实体类属性与单元格信息。
**bean 信息**
- **name** :bean的名称本配置文件唯一, 可根据 name从返回的Map>中获取数据,例如:Set set = (Set) result.get("demo");
- **classPath** :实体类路径
- **sheetName** :Excel文件的sheet的名称,指明读取哪一个页面
- **sheetType** :指明需要读取的数据的类型(规则或不规则),并使用对应的方法读取,此处填写Base.xml中sheetType的id
- **begin** : 只对规则类型读取有效,指明第几行开始读取
- **end** : 只对规则类型读取有效,指明读到第几行结束,若为空时,默认读取到最后一行,程序自行判读
**Item**
对于规则的数据类型,每一个Item实际上是配置Excel文件那一列数据对应实体类的哪一个属性,程序将一行数据封装到一个对象中
对于不规则的数据类型,每一个Item实际上是配置Excel文件一个单元格的数据对应实体类的哪一个属性,程序将分散的数据封装到一个对象中
- **field** : 指明实体类的属性名,采用反射技术根据属性名构建get和set方法,将数据进行封装
- **row** : 对于规则的数据类型不需要配置,对于不规则的数据类型是指明单元格在哪一行
- **cell** : 对于规则的数据类型,配置Excel文件哪一列数据对应实体类的哪一个属性。对于不规则的数据类型,row和cell是一个坐标指明单元格对应实体类的哪一个属性
- **validatorType** : 此处填写Base.xml中validatorType 的id。对于需要负责校验的数据类型,可自行实现校验器进行校验,对应常规的数据类型校验建议使用Hibernate Validator 在实体类中进行注解校验。
- **exceptionMessage** :仅对validatorType不为空时生效, 校验不通过时,对用户的提示语,可为空。
- **optionData** : 校验器中的一个参数,JSON类型格式,为空时填写'{}'。对于Num,Date两个校验器{isNoNull:true}代表该单元格不能为空。
##### 2.创建实体类
实体类用于封装数据,可在实体类中使用注解对配置数据校验规则,具体可查看学习Hibernate Validator注解。由于Excel属于第三方工具,用户输入行为不可控制,因此校验是非常重要的事情,否则后患无穷,从实践操作来看,将实体类属性设为String类型最好校验的,其他类型会增加校验工作的复杂性。
``` java
public class Demo {
@Length(min=1,max=20,message="该字段为必填项,长度为不能超过20")
public String name;
public String age;
public String birthday;
//get,set方法此处省略,使用时不能省略
}
```
##### 将组件导入项目中,调用readExcelClient.read(excelFile, configPath)方法进行读取
```Java
import com.dcits.excelutil.input.ReadExcelClient;
//读取excel文件信息
ReadExcelClient readExcelClient = new ReadExcelClient();
try {
Map> result = readExcelClient.read(new File(filePath), configPath);
//demo 为bean的名称
Set set = (Set) result.get("demo");
for(Demo d : set){
System.out.println("姓名:"+d.getName()+" 年龄:"+d.getAge()+" 生日:"+d.getBirthday());
}
//demo1 为bean的名称
Set set1 = (Set) result.get("demo1");
for(Demo d : set1){
System.out.println("姓名:"+d.getName()+" 年龄:"+d.getAge()+" 生日:"+d.getBirthday());
}
} catch (Exception e) {
e.printStackTrace();
}
```