POI替换word中的指定文字(包含表格,表格中有回车)

网上可以找到很多POI替换Word中指定文字的代码,然而基本上都没有对文档中的表格中包含的段落(回车)进行处理。自己写了,代码记录如下:

/**
*
*@templetStream 文档的输入流
*@data 要替换的key,value的map,将文档中的@key@替换为value值
*
**/
public byte[] genWord2003ByTemplet(InputStream templetStream,Map data) throws IOException {
		XWPFDocument doc = new XWPFDocument(templetStream);
			// 替换段落中的指定文字
			Iterator itPara = doc.getParagraphsIterator();
			while (itPara.hasNext()) {
				XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
				List runs = paragraph.getRuns();
				String beforeOneparaString="";
				for (int i=0; runs!=null&&i entry : data
                            .entrySet()) {
                    	if(oneparaString != null){
                    		if(oneparaString.contains(String.format("@%s@", entry.getKey()))){
                    			oneparaString = oneparaString.replace(String.format("@%s@", entry.getKey()), 
																			Strings.nullToEmpty(entry.getValue()));
                    		}else if(oneparaString.contains(entry.getKey()) && beforeOneparaString.endsWith("@")){
                    			oneparaString = oneparaString.replace(entry.getKey(), Strings.nullToEmpty(entry.getValue()));
                    			runs.get(i-1).setText(beforeOneparaString.substring(0,beforeOneparaString.length()-1), 0);
                    			if(i+1 itTable = doc.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 cells = row.getTableCells();  
                    for (XWPFTableCell cell : cells) {  
                    	//表格中处理段落(回车)
                    	List cellParList= cell.getParagraphs();
                    	for(int p=0; cellParList!=null&&p runs = cellParList.get(p).getRuns(); //每个格子的内容都要单独处理
                    		String beforeOneparaString="";
            				for (int q = 0; runs!=null&&q entry : data.entrySet()) {
                                	if(oneparaString!=null){
                                		if(oneparaString.contains(String.format("@%s@", entry.getKey()))){
                                			oneparaString = oneparaString.replace(String.format("@%s@", entry.getKey()), 
																						Strings.nullToEmpty(entry.getValue()));
                                		}else if(oneparaString.contains(entry.getKey()) && beforeOneparaString.endsWith("@")){
                                			oneparaString = oneparaString.replace(entry.getKey(), 
																						Strings.nullToEmpty(entry.getValue()));
                                			runs.get(q-1)
												.setText(beforeOneparaString.substring(0,beforeOneparaString.length()-1), 0);
                                			if(q+1

你可能感兴趣的:(Java基础)