POI方式替換Word中的文字
阿新 • • 發佈:2019-01-03
開發當中,很多時候我們會需要將我們的資料寫入到Word當中,或者說匯出。這時候我們會使用一些特定的標識來達到我們替換內容的目的。在Word中定義好我們需要替換的內容,也就是模板。然後再寫入資料。原始碼如下:
1.docx檔案中的內容:package com.seawater.controller; import org.apache.poi.POIXMLDocument; import org.apache.poi.xwpf.usermodel.*; import java.io.FileOutputStream; import java.util.*; import java.util.Map.Entry; /** * Created by zhouhs on 2017/1/5. */ public class DocWriter { public static void searchAndReplace(String srcPath, String destPath,Map<String, String> map) { try { XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(srcPath)); /** * 替換段落中的指定文字 */ Iterator<XWPFParagraph> itPara = document.getParagraphsIterator(); while (itPara.hasNext()) { XWPFParagraph paragraph = (XWPFParagraph) itPara.next(); Set<String> set = map.keySet(); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { String key = iterator.next(); List<XWPFRun> run=paragraph.getRuns(); for(int i=0;i<run.size();i++) { if(run.get(i).getText(run.get(i).getTextPosition())!=null && run.get(i).getText(run.get(i).getTextPosition()).equals(key)) { /** * 引數0表示生成的文字是要從哪一個地方開始放置,設定文字從位置0開始 * 就可以把原來的文字全部替換掉了 */ run.get(i).setText(map.get(key),0); } } } } /** * 替換表格中的指定文字 */ Iterator<XWPFTable> itTable = document.getTablesIterator(); while (itTable.hasNext()) { XWPFTable table = (XWPFTable) itTable.next(); int count = table.getNumberOfRows(); for (int i = 0; i < count; i++) { XWPFTableRow row = table.getRow(i); List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) { for (Entry<String, String> e : map.entrySet()) { if (cell.getText().equals(e.getKey())) { cell.removeParagraph(0); cell.setText(e.getValue()); } } } } } FileOutputStream outStream = null; outStream = new FileOutputStream(destPath); document.write(outStream); outStream.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { Map<String, String> map = new HashMap<String, String>(); map.put("${title}", "POI word export"); map.put("${second}", "2"); map.put("${name}", "seawater"); map.put("${tel}", "0000-0000"); map.put("${remark}", "remark info"); String srcPath = "D:\\1.docx"; String destPath = "D:\\2.doc"; searchAndReplace(srcPath, destPath, map); } }
2.doc檔案結果:
需要注意的是在模板檔案中(即1.docx)中我們定義的標識左右都需要加空格,否則可能會出現無法替換的情況。