EXCEL导入
<dependency>
<groupId>org.loulan.application</groupId>
<artifactId>loulan-excel-import</artifactId>
<version>2.0.0</version>
</dependency>
更新说明
1.0.0
- 该版本下的jar包的导入只能值对2007版本下的excel导入,
也就是后缀为xls的表格进行导入。
1.0.1
- 该版本下的jar包配置了2007版本以上的功能导入
2.0.0
- 该版本下的jar包对所以类的路径进行了变换,也就是全限定类名发生了改变,
已经使用1版本的不建议升级到2版本(类路径会发生错误),
jar包说明
一.概述
excel表格的导入采用了xml描述文件方式的规则导入,要提前按要求写好xml文档,xml文档主
要是写明导入excle数据的规则以及一些校验的规则,最后读取并校验之后返回ExcelData对象的数据
,里面包含校验正确数据和校验错误数据。
三种调用方式
1. 默认工作簿
ExcelImportUtil.readExcel(excelStream, xmlStream);
这个是默认使用第一个工作簿进行读取的。
2. 设置工作簿的名称
ExcelImportUtil.readExcel(excelStream, xmlStream,name);
这个可以设置读取工作簿的名称
2. 设置工作簿的名称
ExcelImportUtil.readExcel(excelStream, xmlStream,num);
这个可以设置读取工作簿索引
二. XML校验规则
1. 根节点随便命名,一般是excel-description为名
2. 节点 ,在xml中只能定义一个这样的节点,用来描述excel读取的开始和结束,内部属性有"startRow",表示从第几行开始读取数据;"endFlag"表示读取到哪个字符就表示结束
读取(拥有该结束符的行不算在数据内)。
3. 节点,也是只能定义一个这样的节点,它没有属性,但是内部包含另外一种
节点,就是,这个节点可以有多个,表示的是单元列对应的字段名,它有2个属性;一个是cellColumn表示对应excel中的列,值一般都是A,B,C,D等;另外一个就是fieldName表示对应的字段名。总结下来就是对应的列字段名是什么。excel读取数据的时会按照这个列和字段名进行读取,不会读取其它列的数据。
4. 节点,也是有且只能定义一个这样的节点,表示系统校验器有哪些,它没有属性,但是又子节点,这个节点可以又多个,用来写校验器,它的属性又两个。一个是name表示校验器的名字;一个是value表示检验的全限定类名。
5. 节点,也是有且只能定义一个这样的节点,表示单元格数据校验器集合,它没有属性,但是有子节点,它有一个属性cellname表示的是单元格名称的正则表达式,可以表示一个单元格,也可以用正则表达式来表明一部分单元格。它的下面还有子节点,该节点可以有多个,属性至于一个,是name表示的是系统校验器的名称,表示使用哪些校验器校验这个单元格。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<excel-import-description>
<!--excel读取开始行和结束标志-->
<excel-reader startRow="2" endFlag="END"/>
<!--单元格字段对应-->
<cell-fields>
<cell-field cellColumn="A" fieldName="ID"/>
<cell-field cellColumn="B" fieldName="NAME"/>
<cell-field cellColumn="C" fieldName="AGE"/>
<cell-field cellColumn="D" fieldName="ADDRESS"/>
</cell-fields>
<!-- 校验器定义 -->
<validators>
<validator name="validator1" value="org.loulan.application.excel.imports.validate.NotEmptyValidator" />
<validator name="validator2" value="org.loulan.application.excel.imports.validate.NumberValidator" />
<validator name="modifier" value="org.loulan.application.excel.test.validate.TestValidaate" />
</validators>
<!-- 需要校验的单元格 -->
<cell-validators>
<cell-validator cellname="A[0-9]+">
<validator name="validator1"/>
<validator name="validator2"/>
</cell-validator>
<cell-validator cellname="B2">
<validator name="validator1"/>
<validator name="validator2"/>
</cell-validator>
<cell-validator cellname="C2">
<validator name="validator2"/>
</cell-validator>
<cell-validator cellname="D[0-9]+">
<validator name="validator1"/>
<validator name="modifier"/>
</cell-validator>
</cell-validators>
</excel-import-description>
三. 校验器
我们是可以自己定义校验器的用来校验单元格的数据,校验器必须实现接口ExcelValidator,然后将自己定义的校验器全限定类名写到xml的 系统校验器就可以调用了。
四. 修改器
修改和校验器是异曲同工的,因为它们传输过来的是对象cellDescription,我们可以在修改器里面修改对象的值,但是不能修改对象。
五. 数据结果指示
ExcelData对象里面有两个属性,这两个属性的类型是一样的,他们存储
的数据分别是校验之后正确的数据和校验之后的错误的数据,数据都是按一行为一个map集
合,然后再存储再list集合中。单元格描述对象CellDescription里面有一个属性
message,如果单元校验错误,错误信息就会写在这个单元格对象的这个属性上面。
还有就是一行中如果有一个数据错误,那么这行数据都会被放入错误数据部分。
当然错误分两种,一种是数据校验错误,一种是系统错误(就是校验器的异常引起的)。
测试
package org.loulan.application.excel.test;
import org.junit.Test;
import org.loulan.application.excel.imports.bean.ExcelData;
import org.loulan.application.excel.imports.excelInterface.ExcelImportUtil;
import org.springframework.util.ResourceUtils;
import java.io.FileInputStream;
import java.io.IOException;
/*********************************************************
** Description: excel导入工具测试
** <br><br>
** Date: Created in 2020/3/2 10:58
** @author 楼兰
** @version 0.0.0
*********************************************************/
public class ExcelImportUtilTest {
@Test
public void test () throws IOException {
FileInputStream xmlStream = new FileInputStream(ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "test.xml"));
FileInputStream excelStream = new FileInputStream(ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "test.xlsx"));
ExcelData excelData = ExcelImportUtil.readExcel(excelStream, xmlStream);
System.out.println("结束");
}
}