io.gitee.loulan_yxq.owner.poi.excel.ExcelXmlParseTool Maven / Gradle / Ivy
The newest version!
package io.gitee.loulan_yxq.owner.poi.excel;
import io.gitee.loulan_yxq.owner.core.collection.CollTool;
import io.gitee.loulan_yxq.owner.core.tool.AssertTool;
import io.gitee.loulan_yxq.owner.core.tool.ObjectTool;
import io.gitee.loulan_yxq.owner.core.tool.ReflectTool;
import io.gitee.loulan_yxq.owner.core.tool.StrTool;
import io.gitee.loulan_yxq.owner.poi.excel.entity.ExcelImportCellValidatorRegex;
import io.gitee.loulan_yxq.owner.poi.excel.entity.ExcelImportConfiguration;
import io.gitee.loulan_yxq.owner.poi.excel.validate.ExcelImportValidator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.XMLReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.List;
import java.util.Optional;
/*********************************************************
** excel的xml配置文件解析工具
**
** Date: Created in 2024/2/19 16:29
** @author loulan
** @version 0.0.0
*********************************************************/
public class ExcelXmlParseTool {
/**
* 解析excel导入配置文件
*
* @param xmlStream 导入配置文件
* @return excel导入配置类
* @throws FileNotFoundException 文件找不到异常
* @throws DocumentException 文档异常
* @author :loulan
*/
public static ExcelImportConfiguration parseExcelIMportXml(InputStream xmlStream) throws FileNotFoundException, DocumentException {
// 先判断流数据是否正常
if (xmlStream == null) {
throw new FileNotFoundException("Excel的描述文件(xml)未找到.");
}
// 解析获取xml文档
SAXReader reader = new SAXReader();
Document document = reader.read(xmlStream);
// 获取根节点
Element rootElement = document.getRootElement();
// 获取工作簿节点
Element sheetElement = rootElement.element("sheet");
// 获取配置节点
Element dataConfigElement = sheetElement.element("data-config");
Element validatorsElement = sheetElement.element("validators");
Element cellValidatorsElement = sheetElement.element("cell-validators");
// 创建配置类对象
ExcelImportConfiguration excelImportConfiguration = new ExcelImportConfiguration();
// 解析数据配置节点
importParseDataConfigToDesc(excelImportConfiguration, dataConfigElement);
// 解析校验器节点
importParseValidatorsToDesc(excelImportConfiguration, validatorsElement);
// 解析单元格正则表达式校验器节点
importParseCellValidatorToDesc(excelImportConfiguration, cellValidatorsElement);
return excelImportConfiguration;
}
/**
* 导入解析单元格正则表达式校验器配置节点
*
* @param config 导入配置类对象
* @param element 配置类节点
* @author :loulan
*/
private static void importParseCellValidatorToDesc(ExcelImportConfiguration config, Element element) {
// 先判断元素节点是否存在
if (ObjectTool.isNull(element)) {
// 如果元素不存在那么直接返回
return;
}
// 获取单元格校验器元素
List cellValidatorElementList = element.elements("cell-validator");
if (CollTool.isEmpty(cellValidatorElementList)) {
// 如果节点元素不存在,直接返回
return;
}
// 设置配置类并检查所有配置是否都正确
boolean isOk = cellValidatorElementList.stream().allMatch(ele -> {
try {
// 获取行列的正则表达式
Attribute colAttribute = ele.attribute("col");
Attribute rowAttribyte = ele.attribute("row");
if (ObjectTool.isNull(colAttribute) || StrTool.isEmpty(colAttribute.getValue())
|| ObjectTool.isNull(rowAttribyte) || StrTool.isEmpty(rowAttribyte.getValue())) {
// 如果无法获取元素,那么这个元素有问题,
return false;
}
// 设置单元格校验正则表达式对象
ExcelImportCellValidatorRegex excelImportCellValidatorRegex = new ExcelImportCellValidatorRegex();
excelImportCellValidatorRegex.setColRegex(colAttribute.getValue());
excelImportCellValidatorRegex.setRowRegex(rowAttribyte.getValue());
// 获取对应校验器节点
List validatorElementList = ele.elements("validator");
if (CollTool.isEmpty(validatorElementList)) {
// 如果没有校验器,没关系,就当不校验了
return true;
}
config.getCellRegexValidator().add(excelImportCellValidatorRegex);
// 检查并设置校验器
return validatorElementList.stream().allMatch(o -> {
// 获取对应的校验器名称
Attribute nameAttribute = o.attribute("name");
if (ObjectTool.isNull(nameAttribute) || StrTool.isEmpty(nameAttribute.getValue())) {
return false;
}
// 获取对应校验器
ExcelImportValidator importValidator = config.getValidatorsMap().get(nameAttribute.getValue());
if (ObjectTool.isNull(importValidator)) {
return false;
}
// 设置添加校验器
excelImportCellValidatorRegex.getValidatorList().add(importValidator);
return true;
});
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
});
AssertTool.isTrue(isOk, "单元格校验器配置错误,请检查");
}
/**
* 导入解析校验器
*
* @param config 导入配置类对象
* @param element 配置类节点
* @author :loulan
*/
private static void importParseValidatorsToDesc(ExcelImportConfiguration config, Element element) {
// 先判断配置节点是否存在
if (ObjectTool.isNull(element)) {
// 如果元素不存在那么直接返回
return;
}
// 获取校验器元素
List validatorElementList = element.elements("validator");
if (CollTool.isEmpty(validatorElementList)) {
// 如果节点元素不存在,直接返回
return;
}
// 设置配置类并检查所有配置是否正确
boolean isOk = validatorElementList.stream().allMatch(ele -> {
try {
// 获取配置属性,name校验器名称,value校验器的权限定类名
Attribute nameAttribute = ele.attribute("name");
Attribute valueAttribyte = ele.attribute("value");
if (ObjectTool.isNull(nameAttribute) || StrTool.isEmpty(nameAttribute.getValue())
|| ObjectTool.isNull(valueAttribyte) || StrTool.isEmpty(valueAttribyte.getValue())) {
// 如果无法获取元素,那么这个元素有问题,
return false;
}
String name = nameAttribute.getValue();
String value = valueAttribyte.getValue();
// 获取校验器实体类对象
Object validator = Class.forName(value).getDeclaredConstructor().newInstance();
if (!ObjectTool.isInstanceof(validator, ExcelImportValidator.class)) {
// 如果不是继承关系,那么这个校验器不行
return false;
}
config.getValidatorsMap().put(name, (ExcelImportValidator) validator);
return true;
} catch (Exception ex) {
ex.printStackTrace();
// 发生异常说明有问题,
return false;
}
});
AssertTool.isTrue(isOk, "校验器配置错误,请检查");
}
/**
* 导入解析数据配置到描述类对象
*
* @param config 导入配置类对象
* @param element 配置类节点
* @author :loulan
*/
private static void importParseDataConfigToDesc(ExcelImportConfiguration config, Element element) {
// 先判断配置节点是否存在
if (ObjectTool.isNull(element)) {
// 如果元素不存在那么直接返回
return;
}
// 获取开始位置数据
Attribute startAttribute = element.attribute("start");
if (ObjectTool.isNull(startAttribute) || StrTool.isEmpty(startAttribute.getValue())) {
// 判断属性数据是否存在,如果不存在,那么需要设置默认值
config.setDataStartRow(0);
} else {
config.setDataStartRow(Integer.parseInt(startAttribute.getValue()));
}
// 获取字段对应配置数据
List columnElementList = element.elements("column");
if (CollTool.isEmpty(columnElementList)) {
// 如果节点元素不存在,直接返回
return;
}
// 设置配置类,并检查所有配置是否正确
boolean isOk = columnElementList.stream().allMatch(ele -> {
try {
// 获取头配置属性
Attribute colAttribute = ele.attribute("col");
Attribute keyAttribyte = ele.attribute("key");
if (ObjectTool.isNull(colAttribute) || StrTool.isEmpty(colAttribute.getValue())
|| ObjectTool.isNull(keyAttribyte) || StrTool.isEmpty(keyAttribyte.getValue())) {
// 如果无法获取元素,那么这个元素有问题,
return false;
}
// 设置配置类
Integer colValue = Integer.parseInt(colAttribute.getValue());
String keyValue = keyAttribyte.getValue();
config.getDataTitleConfig().put(colValue, keyValue);
return true;
} catch (Exception ex) {
ex.printStackTrace();
// 发生异常说明有问题,
return false;
}
});
AssertTool.isTrue(isOk, "data-config配置错误,请检查");
}
}