当前位置:文档之家› word的docx中的文字、图片替换说明

word的docx中的文字、图片替换说明

1,需要的jar:2,替换docx文档的文字、图片实例* 注意事项:* word中的替换的文字replaceStr一定是从普通txt文本中粘贴过来的,这样才可以保证这些replaceStr的所有属性一致* 才能保证这些replaceStr在同一个XWPFRun中。

public class WordTest2 {String templatePathX = "D:/temp/打印样本/poi/打印样本.docx";String savePath = "D:/temp/打印样本/poi/打印样本-temp.docx";//imageString logoImagePath = "D:/temp/打印样本/forest_logo.png";String IconImagePath = "D:/temp/打印样本/icon.jpg";@Testpublic void testDocx() {try {WordDocxUtil wordDocxUtil=new WordDocxUtil(templatePathX);// ArrayList<String> replaceEles =wordDocxUtil.getReplaceElements("\\$\\{[^{}]+\\}");// for(String replaceEle:replaceEles){// System.out.println(replaceEle);// }//替换文字// Map<String, String> map = new HashMap<String, String>();// map.put("${orderId}", "B123123");// map.put("${boxName}", "王五");// map.put("${course-1}", "语文");// map.put("${score}", "85");// wordDocxUtil.replaceText(map);//单个文字替换// wordDocxUtil.replaceText("${course}", "语文");//正则表达式文字替换// wordDocxUtil.replaceTextByRegex("\\$\\{course-\\d\\}", "[-_-]");//替换图片// Map<String, Object> imageMap = new HashMap<String, Object>();// imageMap.put("width", "50");// imageMap.put("height", "50");// imageMap.put("imageType", WordDocxUtil.getSuffix(logoImagePath));// imageMap.put("content", WordDocxUtil.inputStream2ByteArray(new FileInputStream(logoImagePath), true));// wordDocxUtil.replaceImage("${forestLogo}", imageMap);//// imageMap = new HashMap<String, Object>();// imageMap.put("width", "50");// imageMap.put("height", "50");// imageMap.put("imageType", WordDocxUtil.getSuffix(IconImagePath));// imageMap.put("content", WordDocxUtil.inputStream2ByteArray(new FileInputStream(IconImagePath), true));// wordDocxUtil.replaceImage("${icon}", imageMap);// setComboboxV alue("paytype", "1,3,5,6");// setComboboxV alue("makeType", "aa,vv");wordDocxUtil.save(savePath);} catch (Exception e) {e.printStackTrace();}}}2,导入docx文档的操作帮助类package com.util;import java.io.ByteArrayInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.poi.POIXMLDocument;import ermodel.UnderlinePatterns;import ermodel.VerticalAlign;import ermodel.XWPFDocument;import ermodel.XWPFParagraph;import ermodel.XWPFRun;import ermodel.XWPFTable;import ermodel.XWPFTableCell;import ermodel.XWPFTableRow;import org.apache.xmlbeans.XmlException;import org.apache.xmlbeans.XmlToken;import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;/*** @author longlin* 注意事项:* 1,替换的特殊文字replaceStr一定是从普通txt文本中粘贴过来的,这样才可以保证这些replaceStr的所有属性一致* 才能保证这些replaceStr在同一个XWPFRun中。

public class WordDocxUtil {XWPFDocument document = null;String suffix;public WordDocxUtil(String filePath) {try {String[] p = filePath.split("\\.");// 判断文件扩展名if (p.length > 0 && p[p.length - 1].equalsIgnoreCase("docx")) {suffix = p[p.length - 1];document = new XWPFDocument(POIXMLDocument.openPackage(filePath));}} catch (IOException e) {e.printStackTrace();}}/*** 返回Docx中需要替换的特殊字符,没有重复项推荐传入正则表达式参数"\\$\\{[^{}]+\\}* @param regex* @return Docx中需要替换的特殊字符*/public ArrayList<String> getReplaceElements(String regex) {ArrayList<String> al = new ArrayList<String>();// 遍历段落Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();while (itPara.hasNext()) {XWPFParagraph paragraph = (XWPFParagraph) itPara.next();al.addAll(getReplaceElements(regex,paragraph));}// 遍历表Iterator<XWPFTable> itTable = document.getTablesIterator();while (itTable.hasNext()) {XWPFTable table = (XWPFTable) itTable.next();int rcount = table.getNumberOfRows();for (int i = 0; i < rcount; i++) {XWPFTableRow row = table.getRow(i);List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {List<XWPFParagraph> paraList=cell.getParagraphs();for(XWPFParagraph paragraph:paraList){al.addAll(getReplaceElements(regex,paragraph));}}}}return al;}/*** 返回Docx中需要替换的特殊字符,没有重复项推荐传入正则表达式参数"\\$\\{[^{}]+\\}* @param regex* @param al* @param paragraph*/private ArrayList<String> getReplaceElements(String regex, XWPFParagraph paragraph) { // System.out.println("====================");ArrayList<String> al = new ArrayList<String>();List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run=runs.get(i);String runString = run.getText(run.getTextPosition());// System.out.println("run["+i+"]:"+runString);if(runString!=null){Pattern pattern = pile(regex);Matcher matcher = pattern.matcher(runString);while (matcher.find()) {if (!al.contains(matcher.group())) {al.add(matcher.group());}}}}return al;}/*** 把word文档中key替换为value* @param map 需要替换的文字如:把${name}替换为“小明”* @return*/public boolean replaceText(Map<String, String> map) {try {// 替换段落中的指定文字Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();while (itPara.hasNext()) {XWPFParagraph paragraph = (XWPFParagraph) itPara.next();replaceText(map, paragraph);}// 替换表格中的指定文字Iterator<XWPFTable> itTable = document.getTablesIterator();while (itTable.hasNext()) {XWPFTable table = (XWPFTable) itTable.next();int rcount = table.getNumberOfRows();for (int i = 0; i < rcount; i++) {XWPFTableRow row = table.getRow(i);List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {List<XWPFParagraph> paraList=cell.getParagraphs();for(XWPFParagraph paragraph:paraList){replaceText(map, paragraph);}}}}return true;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return false;}/*** 把XWPFParagraph中key替换为value* @param map 需要替换的文字如:把${name}替换为“小明”* @param paragraph*/private void replaceText(Map<String, String> map, XWPFParagraph paragraph) { List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run=runs.get(i);String oneparaString = run.getText(run.getTextPosition());if(oneparaString!=null){for (Map.Entry<String, String> entry : map.entrySet()) {oneparaString = oneparaString.replace(entry.getKey(), entry.getValue());}run.setText(oneparaString,0);}}}/*** 根据正则表达式替换字符串* @param regex* @param newText* @return*/public boolean replaceText(String oldText,String newText) {try {Map<String, String> replaceMap=new HashMap<String, String>();replaceMap.put(oldText, newText);return replaceText(replaceMap);} catch (Exception e) {e.printStackTrace();}return false;}/*** 根据正则表达式替换字符串* @param regex* @param newText* @return*/public boolean replaceTextByRegex(String regex,String newText) { try {Map<String, String> map=new HashMap<String, String>();List<String> replaceEles=getReplaceElements(regex);for(String replaceEle:replaceEles){map.put(replaceEle, newText);}return replaceText(map);} catch (Exception e) {e.printStackTrace();}return false;}/**** @param imageReplaceStr 被图片替换的文字* @param imageMap 图片数据需要包括:* width:图片宽* height:图片高* imageType:图片类型* content:图片的具体数据(二进制数据)* @return*/public boolean replaceImage(String imageReplaceStr,Map<String, Object> imageMap) { try {// 替换段落中的指定文字Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();while (itPara.hasNext()) {XWPFParagraph paragraph =(XWPFParagraph)itPara.next();replaceImage(imageReplaceStr,imageMap, paragraph);}// 替换表格中的指定文字Iterator<XWPFTable> itTable = document.getTablesIterator();while (itTable.hasNext()) {XWPFTable table = (XWPFTable) itTable.next();int rcount = table.getNumberOfRows();for (int i = 0; i < rcount; i++) {XWPFTableRow row = table.getRow(i);List<XWPFTableCell> cells = row.getTableCells();for (XWPFTableCell cell : cells) {String cellTextString = cell.getText();if(cellTextString.indexOf(imageReplaceStr)>-1){List<XWPFParagraph> paraList=cell.getParagraphs();for(XWPFParagraph paragraph:paraList){replaceImage(imageReplaceStr,imageMap, paragraph);}}}}}return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 在XWPFParagraph中替换图片* @param imageReplaceStr 被图片替换的文字* @param imageMap 图片数据:* width:图片宽* height:图片高* imageType:图片类型* content:图片的具体数据(二进制数据)* @param paragraph* @throws Exception*/private void replaceImage(String imageReplaceStr,Map<String, Object> imageMap, XWPFParagraph paragraph) throws Exception {List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run=runs.get(i);String oneparaString = run.getText(run.getTextPosition());if(oneparaString!=null){if(oneparaString.indexOf(imageReplaceStr)>-1){//清除原有数据Map<String, Object> oldRunStyle=getWordXWPFRunStyle(run);paragraph.removeRun(i);//得到要添加的图片数据int width = Integer.parseInt(imageMap.get("width").toString());int height = Integer.parseInt(imageMap.get("height").toString());String imageType=(String) imageMap.get("imageType");byte[] byteArray = (byte[]) imageMap.get("content");//向word中插入图片。

相关主题