添加超链接方法

This commit is contained in:
彭宇琦 2020-08-22 14:44:28 +08:00
parent f4b8fb16f3
commit 49c25fa57f
1 changed files with 356 additions and 206 deletions

View File

@ -3,6 +3,7 @@ package pres.auxiliary.tool.file.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@ -37,8 +38,6 @@ import org.dom4j.io.SAXReader;
import pres.auxiliary.tool.regex.RegexType;
import pres.auxiliary.work.selenium.datadriven.ListFileRead;
import pres.auxiliary.work.selenium.xml.UndefinedElementException;
import pres.auxiliary.work.testcase.file.FieldType;
import pres.auxiliary.work.testcase.file.IncorrectFileException;
import pres.auxiliary.work.testcase.file.MarkColorsType;
import pres.auxiliary.work.testcase.templet.LabelNotFoundException;
@ -71,34 +70,39 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
/**
* 用于对待替换词语的标记
*/
private final String WORD_SIGN = "\\#";
protected final String WORD_SIGN = "\\#";
/**
* 用于存储一条用例的信息第一个参数指向配置文件中的字段id第二个字段为xml文件中字段的相应信息
*/
protected HashMap<String, Field> fieldMap = new HashMap<>(16);
// protected HashMap<String, HashMap<String, Field>> fieldMap = new HashMap<>(16);
// protected HashMap<String, Field> fieldMap = new HashMap<>(16);
protected HashMap<String, HashMap<String, Field>> fieldMap = new HashMap<>(16);
/**
* 用于存储所有用例均使用的字段常值
*/
private HashMap<String, String> constValueMap = new HashMap<>(16);
// private HashMap<String, HashMap<String, String>> constValueMap = new HashMap<>(16);
// private HashMap<String, String> constValueMap = new HashMap<>(16);
protected HashMap<String, HashMap<String, String>> constValueMap = new HashMap<>(16);
/**
* 用于存储待替换的词语以及被替换的词语
*/
private HashMap<String, String> replaceWordMap = new HashMap<>(16);
protected HashMap<String, String> replaceWordMap = new HashMap<>(16);
/**
* 用于存储当前用例中正在编写的
*/
protected ArrayList<String> writeSheetNameList = new ArrayList<>();
/**
* 用于存储当前对应的sheet名称
*/
private String sheetName = "";
protected String nowSheetName = "";
/**
* 指向模板文件
*/
private File tempFile;
protected File tempFile;
/**
* 指向配置文件的Document对象
@ -144,7 +148,8 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
}
// 获取xml文件中的第一个sheet标签则将该标签的name属性内容传入getColumnId中
switchSheet(configXml.getRootElement().element("sheet").attributeValue("name"));
// switchSheet(configXml.getRootElement().element("sheet").attributeValue("name"));
getAllColumnId();
// 创建存储字段内容的document类对象
contentXml = DocumentHelper.createDocument();
@ -159,20 +164,24 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
*
* @param sheetName xml配置文件中sheet的name字段内容
*/
public void switchSheet(String sheetName) {
@SuppressWarnings("unchecked")
public T switchSheet(String sheetName) {
// 每次切换sheet时要重新获取一次sheet下的字段id
// 切换sheet后需要清空预设字段中的内容
// 重新获取id包括清空fieldMap
getColumnId(sheetName);
// getColumnId(sheetName);
// 清空常值map
constValueMap.clear();
// constValueMap.clear();
// 清空标记map
// fieldMarkMap.clear();
// 清空预设字段枚举值
// Arrays.stream(FieldType.values()).forEach(e -> e.setValue(""));
// 将相应的sheet标签的name属性存储至sheetName中
this.sheetName = sheetName;
this.nowSheetName = sheetName;
writeSheetNameList.add(sheetName);
return (T) this;
}
@ -187,12 +196,19 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
public void setFieldValue(String field, String content) {
// 为保证在写用例的时候也能生效故将值设置进入fieldMap
//为保证内容被重复添加故需要清空原始内容
clearContent(field);
addContent(field, content);
// clearContent(field);
// addContent(field, content);
// 先将值设置入fieldMap中可以保证field字段是存在于fieldMap中以减少此处再做判断
// 将字段内容写入caseValueMap
constValueMap.put(field, content);
// constValueMap.put(field, content);
//若当前sheetName中不存在常量则先构造HashMap
if (!constValueMap.containsKey(nowSheetName)) {
constValueMap.put(nowSheetName, new HashMap<String, String>(16));
}
//添加常量
constValueMap.get(nowSheetName).put(field, content);
}
/**
@ -222,7 +238,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @throws LabelNotFoundException 当在sheet标签中查不到相应的单元格id不存在时抛出的异常
*/
public T addContent(String field, String... contents) {
return insertContent(field, fieldMap.get(field).content.size(), contents);
return insertContent(field, fieldMap.get(nowSheetName).get(field).content.size(), contents);
}
/**
@ -235,14 +251,14 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
@SuppressWarnings("unchecked")
public T removeContent(String field, int...indexs) {
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
//移除相关的内容若输入的序号不存在则不进行
Arrays.stream(indexs).forEach(index -> {
try {
fieldMap.get(field).content.remove(index);
fieldMap.get(nowSheetName).get(field).content.remove(index);
} catch (Exception e) {
}
});
@ -269,30 +285,36 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
@SuppressWarnings("unchecked")
public T insertContent(String field, int index, String... contents) {
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
//若writeSheetNameList中未存储内容则将当前的sheet名称存储到writeSheetNameList中
//用于记录当前sheet有内容更新
if (writeSheetNameList.isEmpty()) {
writeSheetNameList.add(nowSheetName);
}
//若未传值或传入null则直接结束
if (contents == null || contents.length == 0) {
return (T) this;
}
//若传入的下标大于相应的最大段落数时则直接结束
if (index > fieldMap.get(field).content.size()) {
if (index > fieldMap.get(nowSheetName).get(field).content.size()) {
return (T) this;
}
if (fieldMap.get(field).datas.size() != 0) {
if (fieldMap.get(nowSheetName).get(field).datas.size() != 0) {
//查找数据有效性若当前字段存在数据有效性则将数据有效性转义若添加的字段无法转义则存储原内容
contents = dataValidityChange(contents, fieldMap.get(field));
contents = dataValidityChange(contents, fieldMap.get(nowSheetName).get(field));
}
// 查找特殊词语并对词语进行替换
contents = replaceWord(contents);
// 将字段内容写入fieldMap若插入的下标不正确则不做任何处理
try {
fieldMap.get(field).content.addAll(index, Arrays.asList(contents));
fieldMap.get(nowSheetName).get(field).content.addAll(index, Arrays.asList(contents));
} catch (Exception e) {
}
@ -314,7 +336,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
@SuppressWarnings("unchecked")
public T replaceContent(String field, int index, String... contents) {
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
@ -324,7 +346,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
}
//若传入的下标大于相应的最大段落数时则直接结束
if (index >= fieldMap.get(field).content.size()) {
if (index >= fieldMap.get(nowSheetName).get(field).content.size()) {
return (T) this;
}
@ -345,11 +367,11 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
@SuppressWarnings("unchecked")
public T clearContent(String field) {
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
fieldMap.get(field).content.clear();
fieldMap.get(nowSheetName).get(field).content.clear();
return (T) this;
}
@ -359,6 +381,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
*/
@SuppressWarnings("unchecked")
public FieldMark end() {
/*
// 写入到caseXml中
// 获取所有的sheet标签 并筛选出name属性为sheetName的标签
List<Element> sheetList = ((List<Element>) (contentXml.getRootElement().elements("sheet"))).stream()
@ -370,51 +393,70 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
} else {
sheetElement = contentXml.getRootElement().addElement("sheet").addAttribute("name", sheetName);
}
*/
// 创建case标签
//生成case标签的uuid
String caseUuid = UUID.randomUUID().toString();
Element caseElement = sheetElement.addElement("case").addAttribute("id", caseUuid);
// 为fieldMap中的所有key创建field标签并记录相应的value
fieldMap.forEach((id, field) -> {
//判断字段是否需要进行编号若需要编号则调用编号方法
if (field.serialNumber) {
addSerialNumber(field);
// 创建case标签
writeSheetNameList.forEach(sheetName -> {
// 写入到caseXml中
// 获取所有的sheet标签 并筛选出name属性为sheetName的标签
Element sheetElement = null;
for (Element element : ((List<Element>) (contentXml.getRootElement().elements("sheet")))) {
if (element.attributeValue("name").equals(sheetName)) {
sheetElement = element;
}
}
// 添加field标签并设置name属性字段名称mark属性备注内容
// dom4j当属性值传入null时则直接不会创建该属性故此处无需做判断字段id是否在fieldMarkMap中
Element fieldElement = caseElement.addElement("field").addAttribute("name", id);
//若字段上存在超链接则在xml上加上超链接属性
/*
if (!field.link.isEmpty()) {
fieldElement.addAttribute("link", field.link);
// 判断是否存在sheet标签若不存在则创建相应的标签
if (sheetElement == null) {
sheetElement = contentXml.getRootElement().addElement("sheet").addAttribute("name", sheetName);
}
*/
// 判断当前是否有添加内容若未添加内容则创建一个value属性为空的text标签
if (field.content != null) {
// 读取所有texts字符串数组的所有内容并为每一元素创建一个text标签将值加入属性中
field.content.forEach(text -> {
fieldElement.addElement("text").addAttribute("value", text);
});
} else {
fieldElement.addElement("text").addAttribute("value", "");
}
});
// 清空fieldMap中的内容
clearFieldContent();
// 将字段常值设置入fieldMap中若抛出异常则不进行处理
if (constValueMap != null && constValueMap.size() != 0) {
constValueMap.forEach((field, content) -> {
try {
addContent(field, content);
} catch (LabelNotFoundException e) {
Element caseElement = sheetElement.addElement("case").addAttribute("id", caseUuid);
// 为fieldMap中的所有key创建field标签并记录相应的value
fieldMap.get(nowSheetName).forEach((id, field) -> {
//判断字段是否需要进行编号若需要编号则调用编号方法
if (field.serialNumber) {
addSerialNumber(field);
}
// 添加field标签并设置name属性字段名称mark属性备注内容
// dom4j当属性值传入null时则直接不会创建该属性故此处无需做判断字段id是否在fieldMarkMap中
Element fieldElement = caseElement.addElement("field").addAttribute("name", id);
// 判断当前是否有添加内容若未添加内容则创建一个value属性为空的text标签
if (field.content != null && !field.content.isEmpty()) {
// 读取所有texts字符串数组的所有内容并为每一元素创建一个text标签将值加入属性中
field.content.forEach(text -> {
fieldElement.addElement("text").addAttribute("value", text);
});
} else {
//判断当前字段是否存在于constValueMap中若存在则填写constValueMap中的内容
if (constValueMap != null && constValueMap.get(nowSheetName) != null && constValueMap.get(nowSheetName).containsKey(field.id)) {
//TODO 解决常值只能添加一个问题时需要修改此处代码
fieldElement.addElement("text").addAttribute("value", dataValidityChange(new String[] {constValueMap.get(nowSheetName).get(field.id)}, field)[0]);
} else {
fieldElement.addElement("text").addAttribute("value", "");
}
}
});
}
// 清空fieldMap中的内容
clearFieldContent();
// 将字段常值设置入fieldMap中若抛出异常则不进行处理
/*
if (constValueMap != null && constValueMap.size() != 0) {
constValueMap.get(nowSheetName).forEach((field, content) -> {
try {
addContent(field, content);
} catch (LabelNotFoundException e) {
}
});
}
*/
});
return new FieldMark(caseUuid);
}
@ -475,7 +517,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
// 获取相应的Field对象
String fieldId = fieldElement.attributeValue("name");
// 获取字段的field对象
Field field = fieldMap.get(fieldId);
Field field = fieldMap.get(nowSheetName).get(fieldId);
// 获取text标签
List<Element> textList = fieldElement.elements("text");
@ -633,39 +675,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
}
}
/**
* 将xml文件中编写的文档内部超链接内容进行转换
* @param linkContent 链接内容
* @return 转换后的在poi使用的超链接代码
*/
protected String getDocumentLinkPath(String linkContent) {
String[] linkContents = linkContent.split("|");
int length = linkContents.length;
//若切分后其长度小于2位则抛出异常
if (length < 2) {
throw new IncorrectIndexException("文档内部链接编写错误,缺少分隔符“|”:" + linkContent);
}
//获取超链接的sheet名称
String linkSheetName = linkContents[0];
//根据sheet名称以及字段id获取该字段在sheet中的列数字下标并将数字下标转换为英文下标
String linkColumnIndex = num2CharIndex(getColumnNumIndex(linkSheetName, linkContents[1]));
String linkRowIndex = "";
//判断当前linkContents是否存在链接行数即第三个元素且链接的文本为数字
//若符合规则则将linkRowIndex设置为当前编写的内容
//若不符合规则则将linkRowIndex设置为当前sheet的最后一行
if (length > 2 && linkContents[2].matches("[0-9]+")) {
linkRowIndex = linkContents[2];
} else {
linkRowIndex = String.valueOf(xw.getSheet(linkSheetName).getLastRowNum());
}
//返回文档链接的内容
return "'" + sheetName + "'!" + linkColumnIndex + linkRowIndex;
}
/**
* 返回文本中字段对应的样式可在该方法中添加字段需要添加的相应样式
*
@ -759,7 +768,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* 清空fieldMap内的存储字段信息不清除字段
*/
private void clearFieldContent() {
fieldMap.forEach((key, value) -> value.clearContent());
fieldMap.get(nowSheetName).forEach((key, value) -> value.clearContent());
}
/**
@ -768,43 +777,51 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param sheetName sheet的name属性
*/
@SuppressWarnings("unchecked")
private void getColumnId(String sheetName) {
private void getAllColumnId() {
// 清空fieldMap中的内容
fieldMap.clear();
// fieldMap.clear();
// 获取相应的sheet标签元素
Element sheetElement = (Element) (configXml.selectSingleNode("//sheet[@name='" + sheetName + "']"));
// 获取相应的sheet标签下的column标签
List<Element> column = sheetElement.elements("column");
// Element sheetElement = (Element) (configXml.selectSingleNode("//sheet[@name='" + sheetName + "']"));
configXml.getRootElement().elements("sheet").forEach(sheetElement -> {
// 获取相应的sheet标签下的column标签
List<Element> column = ((Element) sheetElement).elements("column");
// 初始化fieldMap中的字段及其值
for (int index = 0; index < column.size(); index++) {
// 查找xml文件中数据有效性标签
List<Element> datasList = sheetElement.elements("datas");
ArrayList<String> datas = new ArrayList<String>();
// 遍历所有的数据有效性标签若存在则存储相应的数据有效性
for (Element datasElemenet : datasList) {
if (datasElemenet.attributeValue("id").equals(column.get(index).attributeValue("id"))) {
//存储当前的数据有效性的内容
((List<Element>)(datasElemenet.elements())).forEach(textElement -> {
//判断数据有效性的存放位置并按照相应的方法读取数据有效性
if ("file".equalsIgnoreCase(textElement.getName())) {
datas.addAll(getFileDataValidity(textElement));
} else {
datas.add(getLabelDataValidity(textElement));
}
});
break;
// 初始化fieldMap中的字段及其值
for (int index = 0; index < column.size(); index++) {
// 查找xml文件中数据有效性标签
List<Element> datasList = ((Element) sheetElement).elements("datas");
ArrayList<String> datas = new ArrayList<String>();
// 遍历所有的数据有效性标签若存在则存储相应的数据有效性
for (Element datasElemenet : datasList) {
if (datasElemenet.attributeValue("id").equals(column.get(index).attributeValue("id"))) {
//存储当前的数据有效性的内容
((List<Element>)(datasElemenet.elements())).forEach(textElement -> {
//判断数据有效性的存放位置并按照相应的方法读取数据有效性
if ("file".equalsIgnoreCase(textElement.getName())) {
datas.addAll(getFileDataValidity(textElement));
} else {
datas.add(getLabelDataValidity(textElement));
}
});
break;
}
}
//若fieldMap中不存在sheetName则添加相应的内容
String sheetName = ((Element) sheetElement).attributeValue("name");
if (!fieldMap.containsKey(sheetName)) {
fieldMap.put(sheetName, new HashMap<String, Field>(16));
}
nowSheetName = sheetName;
// 存储字段信息
fieldMap.get(sheetName).put(column.get(index).attributeValue("id"),
new Field(column.get(index).attributeValue("id"), column.get(index).attributeValue("align"), index,
column.get(index).attributeValue("row_text"), datas,
Boolean.valueOf(column.get(index).attributeValue("index"))));
}
// 存储字段信息
fieldMap.put(column.get(index).attributeValue("id"),
new Field(column.get(index).attributeValue("id"), column.get(index).attributeValue("align"), index,
column.get(index).attributeValue("row_text"), datas,
Boolean.valueOf(column.get(index).attributeValue("index")),
column.get(index).attributeValue("link")));
}
});
}
/**
@ -907,33 +924,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
}
}
/**
* 用于根据xml配置文件中的标签元素下标返回其在excel中对应的字母
* @param sheetName sheet标签的name属性值
* @param columenId columen标签的id属性值
* @return 对应columen在excel中的列标字母
*/
/*
protected String getColumn(String sheetName, String columenId) {
//根据sheet名称获取相应的sheet元素
Element sheetElement = (Element) configXml.selectSingleNode("//sheet[@name='" + sheetName +"']");
//查找元素下所有column标签
List<?> columnElementList = sheetElement.elements("column");
//遍历columnElementList根据columenId反推对应的元素所在的下标
int index = 0;
for (; index < columnElementList.size(); index++) {
if (((Element) columnElementList.get(index)).attributeValue("id").equals(columenId)) {
break;
}
}
//根据下标计算列表元素相应的字母并以字符串的形式返回
//A的ascii为65
return String.valueOf((char) (65 + index));
}
*/
/**
* 用于根据xml文件中columenId字段所在的位置推出字段在excel中的数字下标
* @param sheetName 字段所在的sheet名称
@ -1020,12 +1010,28 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
return numberIndex;
}
/**
* 用于将传入的下标转换为poi识别的下标主要用于处理负数下标问题以方便其他的方法的调用
* 若传入的下标大于总长度则输出总长度-1若负数的绝对值超过总长度则输出0
* @param length 总行数或总列数
* @param index 传入的下标
* @return 能被poi识别的下标
*/
protected int getPoiIndex(int length, int index) {
//判断下标的绝对值是否大于总长度若大于总长度则根据index的正负来判断返回值
if (Math.abs(index) > length) {
return index > 0 ? length - 1 : 0;
}
//若下标绝对值小于length则判断下标正负正数则直接返回负数则通过总长度
//减去下标由于下标是负数故计算时用总长度加上下标
return index > 0 ? index : length + index;
}
/**
* 用于测试fieldMap中的内容编码结束后删除
*/
/*
* public HashMap<String, String> getCharMap() { return fieldMap; }
*/
public HashMap<String, HashMap<String, AbstractWriteExcel<T>.Field>> getCharMap() { return fieldMap; }
/**
* 用于测试rank中的内容编码结束后删除
@ -1037,14 +1043,14 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
/**
* 用于测试caseXml文件编码结束后删除
*/
// public File getCaseXml() throws IOException {
// File file = new File("src/test/java/pres/auxiliary/work/testcase/用例xml文件.xml");
// FileWriter fw = new FileWriter(file);
// caseXml.write(fw);
// fw.close();
//
// return file;
// }
public File getCaseXml() throws IOException {
File file = new File("src/test/java/pres/auxiliary/work/testcase/用例xml文件.xml");
FileWriter fw = new FileWriter(file);
contentXml.write(fw);
fw.close();
return file;
}
/**
* <p>
@ -1067,7 +1073,8 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
*/
public class FieldMark {
// 用于存储case标签元素
Element caseElement;
// Element caseElement;
String uuid;
/**
* 构造类但不允许外部进行构造
@ -1075,20 +1082,34 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param uuid 用例的uuid
*/
private FieldMark(String uuid) {
caseElement = ((Element) (contentXml.selectSingleNode("//*[@id='" + uuid + "']")));
this.uuid = uuid;
}
/**
* 向单元格字段上添加一个标记备注以记录内容
* 向当前指向的sheet中的单元格字段上添加一个标记备注以记录内容
*
* @param field 字段id
* @param content 标记中记录的内容
* @return 类本身
*/
public FieldMark fieldComment(String field, String content) {
return fieldComment(nowSheetName, field, content);
}
/**
* 向sheet中的单元格字段上添加一个标记备注以记录内容
*
* @param field 字段id
* @param content 标记中记录的内容
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark fieldComment(String field, String content) {
public FieldMark fieldComment(String sheetName, String field, String content) {
//查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getElement(sheetName);
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
@ -1100,84 +1121,155 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
}
/**
* 用于对字段所在的单元格的背景色进行修改
* 用于对当前指向的sheet中字段所在的单元格的背景色进行修改
*
* @param field 字段id
* @param colors {@link MarkColorsType}类枚举
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
public FieldMark changeFieldBackground(String field, MarkColorsType markColorsType) {
return changeFieldBackground(nowSheetName, field, markColorsType);
}
/**
* 用于对指定sheet中字段所在的单元格的背景色进行修改
*
* @param field 字段id
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeFieldBackground(String field, MarkColorsType color) {
public FieldMark changeFieldBackground(String sheetName, String field, MarkColorsType markColorsType) {
//查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getElement(sheetName);
// 判断字段是否存在若不存在则抛出异常
if (!fieldMap.containsKey(field)) {
if (!fieldMap.get(nowSheetName).containsKey(field)) {
throw new LabelNotFoundException("当前sheet不存在的标签id" + field);
}
// 向包含uuid的标签下添加相应的属性
((List<Element>) (caseElement.elements())).stream().filter(e -> e.attributeValue("name").equals(field))
.forEach(e -> e.addAttribute("background", String.valueOf(color.getColorsValue())));
.forEach(e -> e.addAttribute("background", String.valueOf(markColorsType.getColorsValue())));
return this;
}
/**
* 整行用例的背景色进行更改标记
* 当前指向的sheet的整行用例的背景色进行更改标记
*
* @param colors {@link MarkColorsType}类枚举
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
public FieldMark changeRowBackground(MarkColorsType markColorsType) {
return changeRowBackground(nowSheetName, markColorsType);
}
/**
* 对指定sheet的整行用例的背景色进行更改标记
*
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeRowBackground(MarkColorsType color) {
public FieldMark changeRowBackground(String sheetName, MarkColorsType markColorsType) {
//查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getElement(sheetName);
// 将case下所有标签的name属性传至fieldBackground方法
((List<Element>) (caseElement.elements())).stream()
.forEach(e -> changeFieldBackground(e.attributeValue("name"), color));
.forEach(e -> changeFieldBackground(e.attributeValue("name"), markColorsType));
return this;
}
/**
* 该方法用于对整行用例文本的颜色进行标记
* 该方法用于对当前指向的sheet的整行用例文本的颜色进行标记
*
* @param color {@link MarkColorsType}类枚举
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
public FieldMark changeRowTextColor(MarkColorsType markColorsType) {
return changeRowTextColor(nowSheetName, markColorsType);
}
/**
* 该方法用于对指定的sheet中整行用例文本的颜色进行标记
*
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeRowTextColor(MarkColorsType color) {
public FieldMark changeRowTextColor(String sheetName, MarkColorsType markColorsType) {
//查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getElement(sheetName);
// 将case下所有标签的name属性传至fieldBackground方法
((List<Element>) (caseElement.elements())).forEach(fieldElement -> {
List<Element> textElements = fieldElement.elements();
changeTextColor(fieldElement.attributeValue("name"), 0, textElements.size(), color);
changeTextColor(fieldElement.attributeValue("name"), 0, textElements.size(), markColorsType);
});
return this;
}
/**
* 用于对字段的文本进行颜色标记下标从0开始计算若下标小于0时则标记第一段
* 用于对当前指向的sheet字段的文本进行颜色标记下标从0开始计算若下标小于0时则标记第一段
* 若下标大于最大段落数时则编辑最后一段若所传字段下不存在文本标签则不进行标记
*
* @param field 字段id
* @param index 字段文本的段标段落
* @param colors {@link MarkColorsType}类枚举
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
public FieldMark changeTextColor(String field, int index, MarkColorsType color) {
return changeTextColor(field, index, index, color);
public FieldMark changeTextColor(String field, int index, MarkColorsType markColorsType) {
return changeTextColor(nowSheetName, field, index, index, markColorsType);
}
/**
* 用于对指定的sheet字段的文本进行颜色标记下标从0开始计算若下标小于0时则标记第一段
* 若下标大于最大段落数时则编辑最后一段若所传字段下不存在文本标签则不进行标记
*
* @param field 字段id
* @param index 字段文本的段标段落
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
public FieldMark changeTextColor(String sheetName, String field, int index, MarkColorsType markColorsType) {
return changeTextColor(sheetName, field, index, index, markColorsType);
}
/**
* 用于对字段的多段文本进行颜色标记下标从0开始计算若下标小于0时则标记第一段
* 用于对当前指向的sheet中字段的多段文本进行颜色标记下标从0开始计算若下标小于0时则标记第一段
* 若下标大于最大段落数时则编辑最后一段若所传字段下不存在文本标签则不进行标记
* 注意标记的段落包括开始段落但不包括结束段落若开始与结束的段落数相同则标记对应的一行
*
* @param field 字段id
* @param startIndex 字段文本的开始段标段落
* @param endIndex 字段文本的结束段标段落
* @param color {@link MarkColorsType}类枚举
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
public FieldMark changeTextColor(String field, int startIndex, int endIndex, MarkColorsType markColorsType) {
return changeTextColor(nowSheetName, field, startIndex, endIndex, markColorsType);
}
/**
* 用于对指定的sheet字段的多段文本进行颜色标记下标从0开始计算若下标小于0时则标记第一段
* 若下标大于最大段落数时则编辑最后一段若所传字段下不存在文本标签则不进行标记
* 注意标记的段落包括开始段落但不包括结束段落若开始与结束的段落数相同则标记对应的一行
*
* @param field 字段id
* @param startIndex 字段文本的开始段标段落
* @param endIndex 字段文本的结束段标段落
* @param markColorsType {@link MarkColorsType}类枚举
* @return 类本身
*/
@SuppressWarnings("unchecked")
public FieldMark changeTextColor(String field, int startIndex, int endIndex, MarkColorsType color) {
public FieldMark changeTextColor(String sheetName, String field, int startIndex, int endIndex, MarkColorsType markColorsType) {
//查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getElement(sheetName);
// 获取case下的name属性与所传参数相同的field标签
((List<Element>) (caseElement.elements())).stream().filter(e -> e.attributeValue("name").equals(field))
.forEach(fieldElement -> {
@ -1193,7 +1285,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
bigIndex = bigIndex == smallIndex ? (bigIndex + 1) : bigIndex;
for (int index = smallIndex; index < bigIndex; index++) {
setTextColor(textElements, index, color);
setTextColor(textElements, index, markColorsType);
}
}
});
@ -1205,14 +1297,15 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
*
* @param textElements 字段标签下的文本标签
* @param index 标签的位置
* @param color 颜色
* @param markColorsType 颜色
* @return 颜色是否正常进行设置即传入的index是否正常
*/
private void setTextColor(List<Element> textElements, int index, MarkColorsType color) {
private void setTextColor(List<Element> textElements, int index, MarkColorsType markColorsType) {
// 判断传入的index参数
// 若参数小于0则标记第一个标签
// 若参数大于0且小于text最大标签数则标记相应的标签
// 若参数大于text最大标签数则标记最后一个标签
/*
Element textElement;
if (index < 0) {
textElement = textElements.get(0);
@ -1221,7 +1314,69 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
} else {
textElement = textElements.get(textElements.size() - 1);
}
textElement.addAttribute("colors", String.valueOf(color.getColorsValue()));
*/
Element textElement = textElements.get(getPoiIndex(textElements.size(), index));
textElement.addAttribute("colors", String.valueOf(markColorsType.getColorsValue()));
}
/**
* 用于向当前指向的sheet下的指定字段添加超链接超链接文本可传入excel允许的超链接形式详情可
* 参见{@link #fieldLink(String, String, String)}
* @param field 字段id
* @param linkContent 需要链接的内容
* @return 类本身
*/
public FieldMark fieldLink(String field, String linkContent) {
return fieldLink(nowSheetName, field, linkContent);
}
/**
* 用于向指定的的sheet下的指定字段添加超链接超链接文本可传入excel允许的超链接形式包括
*
* @param field 字段id
* @param linkContent 需要链接的内容
* @return 类本身
*/
public FieldMark fieldLink(String sheetName, String field, String linkContent) {
//查找nowSheetName指向的sheet中的与uuid一致的单元格
Element caseElement = getElement(sheetName);
}
/**
* 用于根据链接内容返回相应的超链接类型名称
* @param linkContent 标签中link属性的内容
* @return 超链接类型名称
*/
private String getlinkText(String linkContent) {
String fileRegex = "(([a-zA-Z]:(\\/|\\\\))|(\\.(\\/|\\\\)))([^/:*?<>\\\"|\\\\]+(\\/|\\\\)?)+[^/:*?<>\\\"|\\\\].[^/:*?<>\\\"|\\\\]";
String domRegex = "'[^\\\\\\/\\?\\*\\[\\]]{1,31}'![A-Za-z]+\\d+";
//根据链接内容与相应的正则进行判断根据结果返回相应的HyperlinkType类
if (RegexType.URL.judgeString(linkContent)) {
return "url=" + linkContent;
} else if (RegexType.EMAIL.judgeString(linkContent)) {
return "email=" + linkContent;
} else if (linkContent.matches(fileRegex)) {
return "file=" + linkContent;
} else if (linkContent.matches(domRegex)) {
return "dom=" + linkContent;
} else {
throw new IncorrectIndexException("无法识别的超链接:" + linkContent);
}
}
/**
* 用于根据指定的sheet名称获取其下相应的case标签并返回其元素
* @param sheetName sheet名称
* @return 指定sheet名称下的case标签元素
*/
private Element getElement(String sheetName) {
if (writeSheetNameList.contains(sheetName)) {
throw new IncorrectIndexException("不存在的sheet名称" + sheetName);
}
return ((Element) (contentXml.selectSingleNode("//sheet[@name='" + sheetName +"']/case[@id='" + uuid + "']")));
}
}
@ -1265,10 +1420,6 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* 用于标记是否对字段进行编号
*/
public boolean serialNumber = false;
/**
* 用于标记超链接内容
*/
public String link;
/**
* 用于存储字段在用例中对应的内容
@ -1291,14 +1442,13 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
* @param numberSign 字段是否需要编号
* @param link 超链接内容
*/
public Field(String id, String align, int index, String rowText, ArrayList<String> datas, boolean numberSign, String link) {
public Field(String id, String align, int index, String rowText, ArrayList<String> datas, boolean numberSign) {
this.id = id;
this.align = align;
this.index = index;
this.datas = datas;
this.rowText = rowText == null ? -1 : Integer.valueOf(rowText);
this.serialNumber = numberSign;
this.link = link == null ? "" : link;
}
/**
@ -1409,7 +1559,7 @@ public abstract class AbstractWriteExcel<T extends AbstractWriteExcel<T>> {
}
// 拼接当前数据在数据有效性页中的名称sheetName来自外层类
String dataCellTitle = sheetName + CreateExcelFile.SIGN + id;
String dataCellTitle = nowSheetName + CreateExcelFile.SIGN + id;
// 遍历第一行相应的单元格查看是否存在与sheetName相同的
int cellindex = 0;
for (; cellindex < xr.getLastCellNum(); cellindex++) {