!19 合并修复的功能代码

Merge pull request !19 from 彭宇琦/release/autest_ver2.1.0
This commit is contained in:
彭宇琦 2021-02-18 17:24:36 +08:00 committed by Gitee
commit 85e6ea99c9
9 changed files with 182 additions and 171 deletions

View File

@ -57,10 +57,11 @@
<!-- xml解析工具 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>

View File

@ -265,20 +265,13 @@ public abstract class FindElement {
ArrayList<ByType> elementByTypeList = elementData.getByTypeList();
ArrayList<String> elementValueList = elementData.getValueList();
//获取两个列表长度的最小者
int minLength = Math.min(elementByTypeList.size(), elementValueList.size());
//循环遍历所有的定位方式使用根据定位方式判断页面是否存在定位方式指向的元素
for (int index = 0; index < minLength; index++) {
//根据当前元素信息在页面获取元素
List<WebElement> elementList = findElement(elementByTypeList.get(index),
elementValueList.get(index),
elementData.getWaitTime() == -1 ? globalWaitTime : elementData.getWaitTime());
//若获取到的元素列表为空则继续循环调用下一个定位方式
if (elementList.size() != 0) {
return elementList;
}
}
List<WebElement> elementList = findElement(elementByTypeList, elementValueList,
elementData.getWaitTime() == -1 ? globalWaitTime : elementData.getWaitTime());
//若获取到的元素列表为空则继续循环调用下一个定位方式
if (elementList.size() != 0) {
return elementList;
}
throw new TimeoutException("页面上无相应定位方式的元素,元素名称:" + elementData.getName());
}
@ -286,25 +279,35 @@ public abstract class FindElement {
/**
* 根据传入的定位方式枚举以及定位内容在页面查找
* 元素返回查到的元素列表若查不到元素则返回空列表
* @param byType {@link ByType}枚举类
* @param value 元素定位内容
* @param byTypeList {@link ByType}枚举类集合
* @param valueList 元素定位内容集合
* @param waitTime 元素查找超时时间
* @return 页面查找到的{@link WebElement}类对象{@link List}集合
*/
protected List<WebElement> findElement(ByType byType, String value, long waitTime) {
protected List<WebElement> findElement(List<ByType> byTypeList, List<String> valueList, long waitTime) {
try {
return new WebDriverWait(brower.getDriver(), waitTime, 200)
.until(driver -> {
try {
List<WebElement> webElementList = driver.findElements(getBy(value, byType));
if (webElementList != null && webElementList.size() != 0) {
return webElementList;
} else {
return null;
int minLength = Math.min(byTypeList.size(), valueList.size());
//遍历所有的定位方式与定位内容
for (int i = 0; i < minLength; i++) {
try {
//页面查找元素
List<WebElement> webElementList = driver.findElements(getBy(valueList.get(i), byTypeList.get(i)));
//若元素组为空或者获取的元素为空则重新循环反之则返回找到元素
if (webElementList != null && webElementList.size() != 0) {
return webElementList;
} else {
continue;
}
} catch (Exception e) {
//若抛出异常则重新循环
continue;
}
} catch (Exception e) {
return null;
}
//若循环完毕仍未找到元素则返回null
return null;
});
} catch (TimeoutException e) {
return new ArrayList<WebElement>();

View File

@ -84,6 +84,10 @@ public abstract class AbstractEvent {
wait.withTimeout(Duration.ofSeconds(waitTime));
}
/**
* 用于设置是否将页面移至元素所在的位置
* @param isLocationElement 是否将页面移至元素所在的位置
*/
public void setLocationElement(boolean isLocationElement) {
this.isLocationElement = isLocationElement;
}

View File

@ -115,6 +115,7 @@ public class WaitEvent extends AbstractEvent{
* 该方法用于等待指定元素中显示相应的文本可指定显示文本的关键词直到显示相应的关键词为止
* 若不传入关键词则只判断元素加载出文本若元素未出现则返回false
* @param element {@link Element}对象
* @param keys 需要判断的文本
* @return 元素是否存在文本或包含指定文本
* @throws TimeoutException 等待超时时抛出的异常
*/

View File

@ -59,7 +59,7 @@ public class XmlLocation extends AbstractLocation {
try {
dom = new SAXReader().read(xmlFile);
} catch (DocumentException e) {
throw new IncorrectFileException("xml文件异常文件位置" + xmlFile.getAbsolutePath());
throw new IncorrectFileException("xml文件异常文件位置" + xmlFile.getAbsolutePath(), e);
}
}
@ -76,12 +76,9 @@ public class XmlLocation extends AbstractLocation {
public ArrayList<ByType> findElementByTypeList(String name) {
ArrayList<ByType> byTypeList = new ArrayList<ByType>();
//查询并存储元素下的子元素
@SuppressWarnings("unchecked")
ArrayList<Object> lableElementList = new ArrayList<>(getElementLabelElement(name).elements());
ArrayList<Element> lableElementList = new ArrayList<>(getElementLabelElement(name).elements());
lableElementList.stream()
//强转为Element类型
.map(lable -> (Element)lable)
//获取标签名称
.map(lable -> lable.getName())
//将名称转换为ByType枚举
@ -90,7 +87,6 @@ public class XmlLocation extends AbstractLocation {
.filter(lable -> lable != null)
//存储标签
.forEach(byTypeList::add);
;
return byTypeList;
}
@ -98,25 +94,32 @@ public class XmlLocation extends AbstractLocation {
@Override
public ArrayList<String> findValueList(String name) {
ArrayList<String> valueList = new ArrayList<>();
//查询元素
Element element = getElementLabelElement(name);
//遍历元素下所有的定位标签并将其转换为相应的ByType枚举存储至byTypeList中
for (Object byElement : element.elements()) {
//判断元素是否启用若元素未启用则下一个循环
String isUserText = ((Element) byElement).attributeValue("is_user");
if (isUserText != null && !Boolean.valueOf(isUserText)) {
continue;
}
//判断元素是否启用模板若启用模板则获取模板内容并将定位内容进行转换
String tempId = ((Element) byElement).attributeValue("temp_id");
String value = tempId != null ?
getTemplateValue(tempId, toByType(((Element) byElement).getName())) :
((Element)byElement).getText();
valueList.add(replaceValue(((Element) byElement), value));
}
//查询元素遍历元素下所有的定位标签并过滤掉元素标签
getElementLabelElement(name).elements().stream().filter(ele -> !"element".equals(ele.getName()))
//过滤不启用的标签
.filter(ele -> {
return Optional.ofNullable(ele.attributeValue("is_user"))
.filter(t -> !t.isEmpty())
.map(t -> {
try {
return Boolean.valueOf(t).booleanValue();
} catch (Exception e) {
return true;
}
}).orElse(true);
//根据值或模板将定位内容转译并存储至valueList
}).forEach(ele -> {
String value = "";
String tempId = Optional.ofNullable(ele.attributeValue("temp_id")).orElse("");
if (tempId.isEmpty()) {
value = ele.getText();
} else {
value = getTemplateValue(tempId, toByType(ele.getName()));
}
valueList.add(replaceValue(ele, value));
});
return valueList;
}

View File

@ -101,10 +101,6 @@ public class Screenshot {
* 该方法用于创建截图并保存到相应的路径下通过指定的截图文件名称和类中存储的WebDriver对象截图保存路径来创建截图
*
* @param imageName 指定的截图文件名
* @throws IOException 文件流状态不正确时抛出的异常
* @throws WebDriverException WebDriver引用错误时抛出的异常
* @throws NullPointerException WebDriver为空时抛出的异常
* @throws UndefinedDirectoryException 截图保存路径或截图名称为指定时抛出的异常
*/
public synchronized File creatImage(String imageName) {
// 调用无参方法
@ -150,7 +146,7 @@ public class Screenshot {
}
//判断是否传入文件名若未传入文件名则指定当前时间戳为文件名
File imageFile = new File(savePathFolder + Optional.ofNullable(fileName).filter(text -> !text.isEmpty())
File imageFile = new File(savePathFolder + "/" + Optional.ofNullable(fileName).filter(text -> !text.isEmpty())
.orElse(String.valueOf(Time.parse().getMilliSecond())) + ".png");
// 截图并将得到的截图转移到指定的目录下

View File

@ -14,10 +14,19 @@ import org.dom4j.io.SAXReader;
import com.auxiliary.testcase.file.IncorrectFileException;
/**
* <p><b>文件名</b>Case.java</p>
* <p><b>用途</b>定义测试用例模板类能返回的基本字段提供其相应的get与set方法但该方法不允许包外调用</p>
* <p><b>编码时间</b>2020年3月3日下午8:07:23</p>
* <p><b>修改时间</b>2020年3月4日 07:39:23</p>
* <p>
* <b>文件名</b>Case.java
* </p>
* <p>
* <b>用途</b>定义测试用例模板类能返回的基本字段提供其相应的get与set方法但该方法不允许包外调用
* </p>
* <p>
* <b>编码时间</b>2020年3月3日下午8:07:23
* </p>
* <p>
* <b>修改时间</b>2020年3月4日 07:39:23
* </p>
*
* @author 彭宇琦
* @version Ver1.0
* @since JDK 1.8
@ -36,12 +45,12 @@ public abstract class Case {
* 用于指向用例标签中的id属性
*/
public static final String ATTRIBUTE_ID = "id";
/**
* 用于标记获取标签下所有的文本
*/
protected final String ALL = "-1:getAllText";
/**
* 用于存储需要替换的词语的开始标记
*/
@ -50,29 +59,30 @@ public abstract class Case {
* 用于存储需要替换的词语的结束标记
*/
protected final String END_SIGN = "}*";
/**
* 用于存储传入到正则表达式中的开始标记
*/
protected final String START_SIGN_REGIX = "\\*\\{";
/**
* 用于指向测试用例xml文件的Document对象
*/
protected Document configXml;
protected Document configXml;
/**
* 存储xml文件中其需要替换的词语
*/
protected HashMap<String, String> wordMap = new HashMap<String, String>(16);
/**
* 存储字段的文本内容
*/
protected HashMap<String, ArrayList<String>> fieldTextMap = new HashMap<String, ArrayList<String>>(16);
/**
* 根据用例xml文件来构造Case类
*
* @param configXmlFile xml配置文件
* @throws IncorrectFileException 文件格式或路径不正确时抛出的异常
*/
@ -81,200 +91,204 @@ public abstract class Case {
try {
configXml = new SAXReader().read(configXmlFile);
} catch (DocumentException e) {
throw new IncorrectFileException("用例xml文件有误" );
throw new IncorrectFileException("用例xml文件有误");
}
//查找并存储替换的词语
// 查找并存储替换的词语
saveWord();
//保存字段的词语
// 保存字段的词语
saveField();
}
/**
* 用于设置需要替换的词语
*
* @param word 测试用例xml库中需要替换的词语
* @param text 被替换的词语
*/
public void setReplaceWord(String word, String text) {
//判断该词语是否存在于textMap中若不存在则抛出异常
// 判断该词语是否存在于textMap中若不存在则抛出异常
if (!wordMap.containsKey(word)) {
throw new IncorrectFileException("未找到需要替换的词语:" + word);
}
//存储替换的词语
// 存储替换的词语
wordMap.put(word, text);
}
/**
* 返回字段内容
*
* @return 字段内容
*/
public HashMap<String, ArrayList<String>> getFieldTextMap() {
return fieldTextMap;
}
/**
* 用于替换文本中需要替换的单词返回替换后的文本
*
* @param text 需要替换的文本
* @return 替换后的文本
*/
protected String replaceText(String text) {
StringBuilder sb = new StringBuilder(text);
//存储替换符的位置
// 存储替换符的位置
int index = 0;
//循环替换content中所有需要替换的信息
while( (index = sb.indexOf(START_SIGN)) != -1 ) {
//存储待替换的变量名
// 循环替换content中所有需要替换的信息
while ((index = sb.indexOf(START_SIGN)) != -1) {
// 存储待替换的变量名
String var = "";
try {
var = sb.substring(index + START_SIGN.length(), sb.indexOf(END_SIGN));
} catch (StringIndexOutOfBoundsException e) {
throw new CaseContentException("词语替换错误,无效的标记字符:" + text);
}
//替换该变量名
// 替换该变量名
sb.replace(index, sb.indexOf(END_SIGN) + END_SIGN.length(), wordMap.get(var));
}
return sb.toString();
}
/**
* 用于获取用例xml中对应用例的标签内的文本并返回替换词语后的文本
* @param caseName 用例名称
*
* @param caseName 用例名称
* @param labelType 标签枚举{@link LabelType}
* @param id 对应标签的id属性
* @param id 对应标签的id属性
* @return 标签中存储的文本并进行处理
*/
protected String getLabelText(String caseName, LabelType labelType, String id) {
//返回处理替换的单词后相应的文本
// 返回处理替换的单词后相应的文本
return getLabelText(caseName, labelType.getName(), id);
}
/**
* 用于获取用例xml中对应用例的标签内的文本并返回替换词语后的文本
* @param caseName 用例名称
*
* @param caseName 用例名称
* @param labelName 标签名称
* @param id 对应标签的id属性
* @param id 对应标签的id属性
* @return 标签中存储的文本并进行处理
*/
protected String getLabelText(String caseName, String labelName, String id) {
//拼接xpath规则"//case[@name='caseName']//标签名称[@id='id']"
String xpath = "//" + LabelType.CASE.getName() +
"[@" + ATTRIBUTE_NAME + "='" +
caseName + "']//" + labelName +
"[@" + ATTRIBUTE_ID + "='" + id +"']";
//获取相应的文本内容
Element textElement = (Element)(configXml.selectSingleNode(xpath));
//判断获取的内容是否为空为空则跑出异常
//判断集合是否存在元素若不存在元素则抛出异常
// 拼接xpath规则"//case[@name='caseName']//标签名称[@id='id']"
String xpath = "//" + LabelType.CASE.getName() + "[@" + ATTRIBUTE_NAME + "='" + caseName + "']//" + labelName
+ "[@" + ATTRIBUTE_ID + "='" + id + "']";
// 获取相应的文本内容
Element textElement = (Element) (configXml.selectSingleNode(xpath));
// 判断获取的内容是否为空为空则跑出异常
// 判断集合是否存在元素若不存在元素则抛出异常
if (textElement == null) {
throw new LabelNotFoundException("用例集“" + caseName + "”中不存在id为“" + id + "”的“" + labelName + "”标签");
}
//返回处理替换的单词后相应的文本
// 返回处理替换的单词后相应的文本
return replaceText(textElement.attributeValue(ATTRIBUTE_VALUE));
}
/**
* 用于获取用例xml中对应用例的标签内所有的文本并返回替换词语后的文本
* @param caseName 用例名称
*
* @param caseName 用例名称
* @param labelType 标签枚举
* @return 标签中存储的文本并进行处理
*/
@SuppressWarnings("unchecked")
protected ArrayList<String> getAllLabelText(String caseName, LabelType labelType) {
//拼接xpath规则"//case[@name='caseName']//标签名称[@id='id']"
String xpath = "//" + LabelType.CASE.getName() +
"[@" + ATTRIBUTE_NAME + "='" +
caseName + "']//" + labelType.getName();
// 拼接xpath规则"//case[@name='caseName']//标签名称[@id='id']"
String xpath = "//" + LabelType.CASE.getName() + "[@" + ATTRIBUTE_NAME + "='" + caseName + "']//"
+ labelType.getName();
//获取所有的节点
List<Element> textElements = configXml.selectNodes(xpath);
//存储节点中的value属性内的文本
ArrayList<String> texts = new ArrayList<String>();
//存储节点值
for (int i = 0; i < textElements.size(); i++) {
texts.add(replaceText(textElements.get(i).attributeValue(ATTRIBUTE_VALUE)));
}
// 存储节点中的value属性内的文本
ArrayList<String> texts = new ArrayList<String>();
// 获取所有的节点
configXml.selectNodes(xpath).stream()
.map(e -> (Element) e)
.map(e -> e.attributeValue(ATTRIBUTE_VALUE))
.map(this::replaceText)
.forEach(texts::add);;
return texts;
}
/**
* 用于获取并存储需要替换的词语
*/
@SuppressWarnings("unchecked")
private void saveWord() {
//获取xml中包含value的元素并将其中包含需要替换的词语存储至wordMap
List<Element> textElement = configXml.selectNodes("//*[@" + ATTRIBUTE_VALUE + "]");
textElement.stream().
//获取元素的value属性将其转换为文本对象
map(e -> e.attributeValue(ATTRIBUTE_VALUE)).
//筛选包含*{的文本
filter(e -> e.indexOf(START_SIGN) > -1).forEach(e -> {
//对文本按照*{切割并筛选包含}*的文本
Arrays.asList(e.split(START_SIGN_REGIX)).stream().filter(s -> s.indexOf(END_SIGN) > -1).
forEach(s -> {
//将需要存储的替换词语存入textMap中
wordMap.put(s.substring(0, s.indexOf(END_SIGN)), "");
});
});
// 获取xml中包含value的元素并将其中包含需要替换的词语存储至wordMap
configXml.selectNodes("//*[@" + ATTRIBUTE_VALUE + "]").stream().map(e -> (Element) e)
// 获取元素的value属性将其转换为文本对象
.map(e -> e.attributeValue(ATTRIBUTE_VALUE))
// 筛选包含*{的文本
.filter(e -> e.indexOf(START_SIGN) > -1).forEach(e -> {
// 对文本按照*{切割并筛选包含}*的文本
Arrays.asList(e.split(START_SIGN_REGIX)).stream().filter(s -> s.indexOf(END_SIGN) > -1)
.forEach(s -> {
// 将需要存储的替换词语存入textMap中
wordMap.put(s.substring(0, s.indexOf(END_SIGN)), "");
});
});
}
/**
* 用于保存xml文件中的字段
*/
@SuppressWarnings("unchecked")
protected void saveField() {
//获取case标签下所有的标签存储至fieldTextMap以初始化所有的字段名称
((List<Element>) (configXml.getRootElement().elements("case"))).forEach(caseElement -> {
((List<Element>) caseElement.elements()).forEach(labelElement -> {
//去掉末尾的s
// 获取case标签下所有的标签存储至fieldTextMap以初始化所有的字段名称
configXml.getRootElement().elements("case").forEach(caseElement -> {
caseElement.elements().forEach(labelElement -> {
// 去掉末尾的s
String name = labelElement.getName();
fieldTextMap.put(name.substring(0, name.length() - 1), new ArrayList<String>());
});
});
}
/**
* 用于添加一行文本
*
* @param labelType 标签名称枚举
* @param text 相应内容
* @param text 相应内容
*/
protected void addFieldText(LabelType labelType, String text) {
fieldTextMap.get(labelType.getName()).add(text);
}
/**
* 用于添加多行文本
*
* @param labelName 标签名称
* @param texts 相应内容
* @param texts 相应内容
*/
protected void addFieldText(String labelName, List<String> texts) {
fieldTextMap.get(labelName).addAll(texts);
}
/**
* 用于添加一行文本
*
* @param labelName 标签名称
* @param text 相应内容
* @param text 相应内容
*/
protected void addFieldText(String labelName, String text) {
fieldTextMap.get(labelName).add(text);
}
/**
* 用于添加多行文本
*
* @param label 标签名称枚举
* @param texts 相应内容
*/
protected void addFieldText(LabelType label, List<String> texts) {
fieldTextMap.get(label.getName()).addAll(texts);
}
/**
* 用于清空字段的内容以避免存储上一次输入的用例
*/
@ -283,29 +297,28 @@ public abstract class Case {
fieldTextMap.get(key).clear();
});
}
/**
* 由于添加与参数相关的数据时需要将关联的字段如步骤及结果都添加至其中
* 若后期关联字段增加则代码量将是成倍的增加故将关联的内容提取出来
* 外部进行添加之后修改关联字段时只需修改该方法即可若传入-1则表示
* 获取xml中该标签下的所有的信息<br>
/**
* 由于添加与参数相关的数据时需要将关联的字段如步骤及结果都添加至其中 若后期关联字段增加则代码量将是成倍的增加故将关联的内容提取出来
* 外部进行添加之后修改关联字段时只需修改该方法即可若传入-1则表示 获取xml中该标签下的所有的信息<br>
* 参数表
* <ol>
* <li>步骤</li>
* <li>预期</li>
* </ol>
*
* @param caseName 读取的用例名称
* @param ids id参数串
* @param ids id参数串
*/
protected void relevanceAddData(String caseName, String...ids) {
//添加步骤
protected void relevanceAddData(String caseName, String... ids) {
// 添加步骤
if (ids[0].equals(ALL)) {
addFieldText(LabelType.STEP, getAllLabelText(caseName, LabelType.STEP));
} else {
addFieldText(LabelType.STEP, getLabelText(caseName, LabelType.STEP, ids[0]));
}
//添加预期
// 添加预期
if (ids[1].equals(ALL)) {
addFieldText(LabelType.EXCEPT, getAllLabelText(caseName, LabelType.EXCEPT));
} else {

View File

@ -465,7 +465,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @throws IOException 流异常时抛出的异常
* @throws IncorrectFileException 当模板文件内容异常时抛出的异常
*/
@SuppressWarnings("unchecked")
public void writeFile() throws IOException {
// 定义输入流用于读取模版文件
FileInputStream fip = new FileInputStream(tempFile);
@ -507,7 +506,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param caseElement case标签对应的elemenet对象
* @return 当前行号
*/
@SuppressWarnings("unchecked")
private void writeContent(int index, XSSFSheet xs, Element caseElement) {
// 获取字段元素需要获取配置xml文件中的以及用例xml文件中的字段
List<Element> fieldElements = caseElement.elements("field");
@ -804,7 +802,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
*
* @param sheetName sheet的name属性
*/
@SuppressWarnings("unchecked")
private void getAllColumnId() {
// 清空fieldMap中的内容
// fieldMap.clear();
@ -1148,7 +1145,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param content 标记中记录的内容
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark fieldComment(String sheetName, String field, String content) {
// 查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getCaseElement(sheetName);
@ -1183,7 +1179,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeFieldBackground(String sheetName, String field, MarkColorsType markColorsType) {
// 查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getCaseElement(sheetName);
@ -1216,7 +1211,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeRowBackground(String sheetName, MarkColorsType markColorsType) {
// 查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getCaseElement(sheetName);
@ -1244,7 +1238,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeRowTextColor(String sheetName, MarkColorsType markColorsType) {
// 查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getCaseElement(sheetName);
@ -1310,7 +1303,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeTextColor(String sheetName, String field, int startIndex, int endIndex,
MarkColorsType markColorsType) {
// 查找nowSheetName指向的sheet中的与uuid一致的单元格

View File

@ -239,7 +239,6 @@ public class CreateExcelFile {
*
* @param xw 指向excel文件对象
*/
@SuppressWarnings("unchecked")
private void createDataValidation(XSSFWorkbook xw) {
// 读取所有sheet标签
List<Element> xmlSheetList = xml.getRootElement().elements("sheet");
@ -336,7 +335,6 @@ public class CreateExcelFile {
* @param rowIndex
* @param columnIndex
*/
@SuppressWarnings("unchecked")
private void writeDataValidity(Element datasElement, XSSFSheet dataSheet, int rowIndex, int columnIndex) {
// 添加数据获取相应datas下的所有data标签
List<Element> dataElementList = datasElement.elements();