All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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配置错误,请检查"); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy