POI根據word模板替換匯出setText內容不能換行問題。
阿新 • • 發佈:2019-01-08
此文給java用poi操作word模板是出現不能換行的朋友一個建議,僅供參考。如有問題請留言。//word模板路徑 String inFile = rootPath+"報告.docx"; //word輸出路徑 String outFile = rootPath + "輸出報告.docx"; XWPFDocument doc; //params 引數 Map<String, String> params = new HashMap<String, String>(); params.put("titleOne","1、重新組織全科護理人員學習口服藥的執行流程並作考核。\r2、加強病人安全管理相關制度的學習、提高安全生產意識。\r3、組長、護長加強制度落實的監管,持續跟進一週責任護士發放口服藥的流程執行情況,並不定期進行隨檢。"); try { InputStream is = new FileInputStream(inFile); doc = new XWPFDocument(OPCPackage.open(is)); Set<Entry<String, String>> set = params.entrySet(); List<XWPFParagraph> list = doc.getParagraphs(); //para 要替換的段落 for(XWPFParagraph para:list){ List<XWPFRun> runs = para.getRuns(); for (int i=0; i<runs.size(); i++) { XWPFRun run = runs.get(i); if("".equals(replaceText(run.text(), set))){ run.setText(replaceText(run.text(), set),0); }else{ String runText = replaceText(run.text(), set); if(runText.indexOf("\r")>0) { String[] text = runText.split("\r"); //直接呼叫XWPFRun的setText()方法設定文字時,在底層會重新建立一個XWPFRun,把文字附加在當前文字後面, //所以我們不能直接設值,需要先刪除當前run,然後再自己手動插入一個新的run。 para.removeRun(i); run = para.insertNewRun(i); for(int f=0;f<text.length;f++) { if(f==0){ //此處不縮排因為word模板已經縮進了。 run.setText(text[f].trim()); }else{ run.addCarriageReturn();//硬回車 //注意:wps換行首行縮排是三個空格符,office要的話可以用 run.addTab();縮排或者四個空格符 run.setText(" "+text[f].trim()); } } //設定字型 run.setFontFamily("宋體"); //字型大小 run.setFontSize(12); //行間距 run.setTextPosition(22); }else { run.setText(replaceText(run.text(), set),0); run.setTextPosition(22); } } } } OutputStream os = new FileOutputStream(outFile); doc.write(os); close(os); close(is); } catch (Exception e) { throw e; }