package com.lf.server.helper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.xwpf.usermodel.*; import java.io.*; import java.util.List; import java.util.Map; /** * Word帮助类 * @author WWW */ public class WordHelper { private final static Log log = LogFactory.getLog(WordHelper.class); /** * 通过word模板生成word的主方法 */ public static void generateWord(String inputFile, String outPutFile, Map insertTextMap, List addList) { try { FileInputStream inputStream = new FileInputStream(inputFile); FileOutputStream outputStream = new FileOutputStream(outPutFile); // 获取docx解析对象 XWPFDocument xwpfDocument = new XWPFDocument(inputStream); // 处理所有文段数据,除了表格 if (null != insertTextMap && insertTextMap.size() > 0) { handleParagraphs(xwpfDocument, insertTextMap); } // 处理表格数据 handleTable(xwpfDocument, insertTextMap, addList); // 写入数据 xwpfDocument.write(outputStream); outputStream.close(); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } /** * 处理所有文段数据,除了表格 */ public static void handleParagraphs(XWPFDocument xwpfDocument, Map insertTextMap) { for (XWPFParagraph paragraph : xwpfDocument.getParagraphs()) { String text = paragraph.getText(); if (isReplacement(text)) { for (XWPFRun run : paragraph.getRuns()) { // 判断带有 ${} 的run run.setText(matchesValue(run.text(), insertTextMap), 0); } } } } /** * 处理表格数据方法 */ public static void handleTable(XWPFDocument xwpfDocument, Map map, List addList) { List tables = xwpfDocument.getTables(); for (XWPFTable table : tables) { List rows = table.getRows(); if (rows.size() < 2) { continue; } if (isReplacement(table.getText())) { if (null == map || map.isEmpty()) { continue; } replaceData(rows, map); } else { insertData(table, addList); } } } /** * 替换数据 */ private static void replaceData(List rows, Map map) { for (XWPFTableRow row : rows) { List tableCells = row.getTableCells(); for (XWPFTableCell tableCell : tableCells) { if (isReplacement(tableCell.getText())) { List paragraphs = tableCell.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { run.setText(matchesValue(tableCell.getText(), map), 0); } } } } } } /** * 插入数据 */ private static void insertData(XWPFTable table,List addList) { for (int i = 1; i < addList.size(); i++) { XWPFTableRow row = table.createRow(); } List rowList = table.getRows(); for (int i = 1; i < rowList.size(); i++) { XWPFTableRow xwpfTableRow = rowList.get(i); List tableCells = xwpfTableRow.getTableCells(); for (int j = 0; j < tableCells.size(); j++) { XWPFTableCell xwpfTableCell = tableCells.get(j); xwpfTableCell.setText(addList.get(i - 1)[j]); } } } /** * 有${}的值匹配出替换的数据,没有${}就返回原来的数据 * * @param wordValue ${...} 带${}的变量 * @param map 存储需要替换的数据 * @return java.lang.String */ public static String matchesValue(String wordValue, Map map) { for (String s : map.keySet()) { String s1 = "${" + s + "}"; if (s1.equals(wordValue)) { wordValue = map.get(s); } } return wordValue; } /** * 测试是否包含需要替换的数据 */ public static boolean isReplacement(String text) { return text.contains("$"); } }