public static String getWordFile(String templates, String filePath, String fileName, Map<String, String> params) throws IOException { File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } try(InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream(templates); OutputStream outputStream = new FileOutputStream(filePath + "/" + fileName);){ XWPFDocument document = new XWPFDocument(inputStream); replaceInPara(document, params); document.write(outputStream); }catch (IOException e){ throw new IOException("io异常",e); } return filePath; } public static String getTableWordFile(String templates, String filePath, String fileName, Map<String, String> params) throws IOException { File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } try( InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream(templates); OutputStream outputStream = new FileOutputStream(filePath + "/" + fileName);) { XWPFDocument document = new XWPFDocument(inputStream); replaceInTable(document, params); document.write(outputStream); }catch (IOException e){ throw new IOException("io异常",e); } return filePath; }
private static void replaceInPara(XWPFDocument document, Map<String, String> params) { Iterator<XWPFParagraph> iterator = document.getParagraphsIterator(); XWPFParagraph para; while (iterator.hasNext()) { para = iterator.next(); replaceInPara(para, params); } } private static void replaceInTable(XWPFDocument document, Map<String, String> params) { Iterator<XWPFParagraph> iteratorHr = document.getParagraphsIterator(); XWPFParagraph paraHr; while(iteratorHr.hasNext()) { paraHr = iteratorHr.next(); if(replaceTablePara(paraHr, params,false)){ break; } } Iterator<XWPFTable> iterator = document.getTablesIterator(); XWPFTable table; List<XWPFTableRow> rows; List<XWPFTableCell> cells; List<XWPFParagraph> paras; while (iterator.hasNext()) { table = iterator.next(); rows = table.getRows(); for (XWPFTableRow row : rows) { cells = row.getTableCells(); for (XWPFTableCell cell : cells) { paras = cell.getParagraphs(); for (XWPFParagraph para : paras) { replaceTablePara(para, params,true); } } } } }
private static void replaceInPara(XWPFParagraph para, Map<String, String> params) { List<XWPFRun> runs; runs = para.getRuns(); for (int i = 0; i < runs.size(); i++) { XWPFRun run = runs.get(i); String runText = run.toString(); System.out.println(runText); for (Map.Entry<String, String> entry : params.entrySet()) { runText = runText.replace(entry.getKey(), entry.getValue()); } String font = run.getFontFamily(); int fontSize = run.getFontSize(); para.removeRun(i); run = para.insertNewRun(i); run.setFontFamily(font); run.setFontSize(fontSize); run.setText(runText); } }
/** * 替换段落里面的变量 * @param para 要替换的段落 * @param params 参数 * @param tableIn 是否有table内 */ private static boolean replaceTablePara(XWPFParagraph para, Map<String, String> params,boolean tableIn) { boolean res=false; List<XWPFRun> runs; runs = para.getRuns(); if(tableIn) { for (int i = 0; i < runs.size(); i++) { XWPFRun run = runs.get(i); String runText = run.toString().trim(); if(StringUtil.isNull(runText)){ continue; } System.out.println(runText); if (StringUtil.isNotEmpty(params.get(runText))) { runText = runText.replace(runText, params.get(runText)); String font = run.getFontFamily(); int fontSize = run.getFontSize(); para.removeRun(i); run = para.insertNewRun(i); run.setFontFamily(font); run.setFontSize(fontSize); if ("NULL".equals(runText)) { run.setText(""); } else { run.setText(runText); } } } }else { for (int j = 0; j < runs.size(); j++) { XWPFRun run = runs.get(j); String runText = run.toString().trim(); System.out.println("处理表格外数据:"+runText); if (StringUtil.isNotEmpty(params.get(runText))&& "currentDate_Head".equals(runText)) { res=true; runText = runText.replace(runText, params.get(runText)); String font = run.getFontFamily(); int fontSize = run.getFontSize(); para.removeRun(j); run = para.insertNewRun(j); run.setFontFamily(font); run.setFontSize(fontSize); if ("NULL".equals(runText)) { run.setText(""); } else { run.setText(runText); } } } } return res; }