/*变量替换, 在将word解析成xml时,对于会被变量被拆分问题,会将变量合并。 if(text1!=null && text1.endsWith("}")){ num=j-i; break; } 在变量为null时,会将变量替换为""。 if(value == null){ value = ""; } */ public void generateDoc(String srcPath,String destPath,Map<String, Object> map) throws IOException { /* map.put("@projectName}","李逵"); map.put("@username}","张居正"); map.put("@password}","陈腾跃");*/ //创建文档对象 //String aa = "D:\\1607056014056_55.docx"; logger.info("+++++++++++"+srcPath); XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath)); // XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(aa)); //获取所有段落 List<XWPFParagraph> paragraphList = document.getParagraphs(); for(XWPFParagraph paragraph:paragraphList){ //遍历获取段落中所有的runs List<XWPFRun> runs = paragraph.getRuns(); //合并逻辑 for(Integer i = 0; i < runs.size(); i++){ String text0 = runs.get(i).getText(runs.get(i).getTextPosition()); if(text0!=null && text0.startsWith("@")){ //记录分隔符中间跨越的runs数量,用于字符串拼接和替换 int num=0; int j = i+1; for(; j < runs.size(); j++){ String text1 = runs.get(j).getText(runs.get(j).getTextPosition()); if(text1!=null && text1.endsWith("}")){ num=j-i; break; } } if(num!=0) { //num!=0说明找到了@}配对,需要替换 StringBuilder newText = new StringBuilder(); for (int s = i; s <= i+num; s++) { String text2 = runs.get(s).getText(runs.get(s).getTextPosition()); if(text2==null){ text2 = "" ; } newText.append(text2); runs.get(s).setText(null, 0); } runs.get(i).setText(newText.toString(),0); //重新定义遍历位置,跳过设置为null的位置 i=j+1; } } } //变量替换逻辑 for(int i = 0; i < runs.size(); i++){ XWPFRun run = runs.get(i); String text = run.getText(runs.get(i).getTextPosition()); if(text != null){ boolean isSetText = false; for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); if(text.indexOf(key) != -1){ isSetText = true; Object value = entry.getValue(); if(value == null){ value = ""; } if (value instanceof String) {//文本替换 text = text.replace(key, value.toString()); } else if (value instanceof Map) {//图片替换 //从map中获取图片的宽、高、位置和描述信息,编写图片定义xml 放入 } } } if(isSetText){ run.setText(text,0); } } } } FileOutputStream outStream = null; outStream = new FileOutputStream(destPath); document.write(outStream); outStream.close(); }
word变量替换,解决解析成xml时变量分割以及值为null的问题
于 2021-01-05 18:28:49 首次发布