1.需求
指定的参数列表(list),要求word文档占位符与list的值存在匹配的值
例如:List: [ “${1}”,“${2}”,“${3}”]
使用 List 与文档内含有 ${1} ,${2} ,${3}占位符的内容进行值比对,比对成功,word才是正确的文档,否则文档格式就是有误,list内有${1} ,${2} ,${3},则文档内也要有${1} ,${2} ,${3}
2.代码
1、将word文件转为流数据
//将word文件转成流数据
InputStream stream = wordFile.getInputStream();
//拿到填充list的数据
List<Param> List = ParamInfoMapper.selectList(new QueryWrapper<ParamInfo().lambda().eq(ParamInfo::getBid, TempInfo.getId()));
/**
* word占位符与参数校验
*/
XWPFDocument document = new XWPFDocument(inputStream);
Map<String,String> paramMap = new HashMap<>();
//用set存word中取出的占位符===>去重
HashSet<String> wordMap2 = new HashSet<>();
//将list内的的数据放入map中
if(List .size()>0){
List.forEach(Param -> {
paramMap.put(Param.getParam(),"${"+Param.getParam()+"}");
});
}
//拿到文档的内容
Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
//占位符切割字符的初始值
int first=1,last;
//文档内容进行循环
while (itPara.hasNext()) {
XWPFParagraph paragraph = itPara.next();
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
//拿到内容 例如:«${测试}»
String oneparaString = run.getText(run.getTextPosition());
//如果拿到的段落为空直接跳过
if (org.codehaus.plexus.util.StringUtils.isBlank(oneparaString)) {
continue;
}
//如果段落内包含${占位符的数据,加入占位符map内
if (oneparaString.contains("${")) {
//拿到结束位置的下标 }
last = oneparaString.indexOf("}") + 1;
//截取包含占位符的内容 从下标为 1-last 的内容:如 ${测试} 占位符不同需自行调整
String keyWord = oneparaString.substring(first, last);
//将值放入set集合内(set不允许存在相同的值,达到自动去重的效果)
wordMap2.add(keyWord);
}
run.setText(oneparaString, 0);
}
}
System.out.println(paramMap);
int paramMapSize = paramMap.size();
int setL = wordMap2.size();
//先进行长度匹配,如果两个map长度不相等则不匹配,抛异常
if (paramMapSize != setL){
throw new EcSignException("参数与模板长度不匹配!",TypeEnum.ERROR.getCode());
}
//长度相等后,两个map进行值比对,值内容不存在配对数据抛异常
if (paramMap.size()>0){
//如果
Iterator it = wordMap2.iterator();
while(it.hasNext()){
if (!paramMap.containsValue(it.next())){
throw new EcSignException("参数内容与文档不匹配,请核查模板!", TypeEnum.ERROR.getCode());
}
}
}