package com.lf.server.helper; import org.apache.poi.xwpf.usermodel.*; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import java.util.Map; /** * Word帮助类 * @author WWW */ public class WordHelper { /** * 通过word模板生成word的主方法 */ public static void generateWord(InputStream inputStream, OutputStream outputStream, Map insertTextMap, List addList) throws IOException { // 获取docx解析对象 XWPFDocument xwpfDocument = new XWPFDocument(inputStream); // 处理所有文段数据,除了表格 handleParagraphs(xwpfDocument, insertTextMap); // 处理表格数据 handleTable(xwpfDocument, insertTextMap, addList); // 写入数据 xwpfDocument.write(outputStream); outputStream.close(); } /** * 处理所有文段数据,除了表格 */ 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 insertTextMap, List addList) { List tables = xwpfDocument.getTables(); for (XWPFTable table : tables) { List rows = table.getRows(); if (rows.size() < 2) { continue; } if (isReplacement(table.getText())) { // 替换数据 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(), insertTextMap), 0); } } } } } } else { // 插入数据 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("$"); } }