package com.lf.server.helper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; 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) { FileInputStream inputStream = null; FileOutputStream outputStream = null; try { inputStream = new FileInputStream(inputFile); 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); } catch (Exception ex) { log.error(ex.getMessage(), ex); } finally { try { if (outputStream != null) { outputStream.close(); } if (inputStream != null) { inputStream.close(); } } catch (Exception e) { log.error(e.getMessage(), e); } } } /** * 处理所有文段数据,除了表格 */ 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, c = addList.size(); i < c; i++) { table.createRow(); } List oldCells = table.getRow(1).getTableCells(); List rowList = table.getRows(); for (int i = 0, c = addList.size(); i < c; i++) { XWPFTableRow xwpfTableRow = rowList.get(i + 1); List tableCells = xwpfTableRow.getTableCells(); for (int j = 0; j < tableCells.size(); j++) { XWPFTableCell oldCell = oldCells.get(j); XWPFTableCell newCell = tableCells.get(j); if (0 == i) { // newCell.setText(addList.get(i)[j]) setCellText(newCell, addList.get(i)[j]); } else { setCellText(oldCell, newCell, addList.get(i)[j]); } } } } /** * 设置单元格文本 */ private static void setCellText(XWPFTableCell cell, String text) { List paragraphs = cell.getParagraphs(); for (XWPFParagraph paragraph : paragraphs) { List runs = paragraph.getRuns(); for (XWPFRun run : runs) { run.setText(text, 0); } } } /** * 有${}的值匹配出替换的数据,没有${}就返回原来的数据 * * @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("$"); } /** * 复制模板行的属性 */ private static void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell, String text) { CTTc cttc2 = tmpCell.getCTTc(); CTTcPr ctPr2 = cttc2.getTcPr(); CTTc cttc = cell.getCTTc(); CTTcPr ctPr = cttc.addNewTcPr(); if (ctPr2.getTcW() != null) { ctPr.addNewTcW().setW(ctPr2.getTcW().getW()); } if (ctPr2.getVAlign() != null) { ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal()); } if (ctPr2.getTcBorders() != null) { ctPr.setTcBorders(ctPr2.getTcBorders()); } XWPFParagraph tmpP = tmpCell.getParagraphs().get(0); XWPFParagraph cellP = cell.getParagraphs().get(0); XWPFRun tmpR = null; if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) { tmpR = tmpP.getRuns().get(0); } XWPFRun cellR = cellP.createRun(); cellR.setText(text); // 复制字体信息 copyFontInfo(cellR, tmpR); // 复制段落信息 cellP.setAlignment(tmpP.getAlignment()); cellP.setVerticalAlignment(tmpP.getVerticalAlignment()); cellP.setBorderBetween(tmpP.getBorderBetween()); cellP.setBorderBottom(tmpP.getBorderBottom()); cellP.setBorderLeft(tmpP.getBorderLeft()); cellP.setBorderRight(tmpP.getBorderRight()); cellP.setBorderTop(tmpP.getBorderTop()); cellP.setPageBreak(tmpP.isPageBreak()); if (tmpP.getCTP() != null&&tmpP.getCTP().getPPr() != null) { CTPPr tmpPpr = tmpP.getCTP().getPPr(); CTPPr cellPpr = cellP.getCTP().getPPr() != null ? cellP.getCTP().getPPr() : cellP.getCTP().addNewPPr(); // 复制段落间距信息 copySpacing(tmpPpr, cellPpr); // 复制段落缩进信息 copyParagraph(tmpPpr, cellPpr); } } /** * 复制字体信息 */ private static void copyFontInfo(XWPFRun cellR, XWPFRun tmpR) { if (tmpR == null) { return; } if (!cellR.isBold()) { cellR.setBold(tmpR.isBold()); } cellR.setItalic(tmpR.isItalic()); cellR.setUnderline(tmpR.getUnderline()); cellR.setColor(tmpR.getColor()); cellR.setTextPosition(tmpR.getTextPosition()); if (tmpR.getFontSize() != -1) { cellR.setFontSize(tmpR.getFontSize()); } if (tmpR.getFontFamily() != null) { cellR.setFontFamily(tmpR.getFontFamily()); } if (tmpR.getCTR() != null) { if (tmpR.getCTR().isSetRPr()) { CTRPr tmpRpr = tmpR.getCTR().getRPr(); if (tmpRpr.isSetRFonts()) { CTFonts tmpFonts = tmpRpr.getRFonts(); CTRPr cellRpr = cellR.getCTR().isSetRPr() ? cellR .getCTR().getRPr() : cellR.getCTR().addNewRPr(); CTFonts cellFonts = cellRpr.isSetRFonts() ? cellRpr .getRFonts() : cellRpr.addNewRFonts(); cellFonts.setAscii(tmpFonts.getAscii()); cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme()); cellFonts.setCs(tmpFonts.getCs()); cellFonts.setCstheme(tmpFonts.getCstheme()); cellFonts.setEastAsia(tmpFonts.getEastAsia()); cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme()); cellFonts.setHAnsi(tmpFonts.getHAnsi()); cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme()); } } } } /** * 复制段落间距信息 */ private static void copySpacing(CTPPr tmpPpr, CTPPr cellPpr) { CTSpacing tmpSpacing = tmpPpr.getSpacing(); if (tmpSpacing != null) { CTSpacing cellSpacing = cellPpr.getSpacing() != null ? cellPpr.getSpacing() : cellPpr.addNewSpacing(); if (tmpSpacing.getAfter() != null) { cellSpacing.setAfter(tmpSpacing.getAfter()); } if (tmpSpacing.getAfterAutospacing() != null) { cellSpacing.setAfterAutospacing(tmpSpacing .getAfterAutospacing()); } if (tmpSpacing.getAfterLines() != null) { cellSpacing.setAfterLines(tmpSpacing.getAfterLines()); } if (tmpSpacing.getBefore() != null) { cellSpacing.setBefore(tmpSpacing.getBefore()); } if (tmpSpacing.getBeforeAutospacing() != null) { cellSpacing.setBeforeAutospacing(tmpSpacing .getBeforeAutospacing()); } if (tmpSpacing.getBeforeLines() != null) { cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines()); } if (tmpSpacing.getLine() != null) { cellSpacing.setLine(tmpSpacing.getLine()); } if (tmpSpacing.getLineRule() != null) { cellSpacing.setLineRule(tmpSpacing.getLineRule()); } } } /** * 复制段落缩进信息 */ private static void copyParagraph(CTPPr tmpPpr, CTPPr cellPpr) { CTInd tmpInd = tmpPpr.getInd(); if (tmpInd != null) { CTInd cellInd = cellPpr.getInd() != null ? cellPpr.getInd() : cellPpr.addNewInd(); if (tmpInd.getFirstLine() != null) { cellInd.setFirstLine(tmpInd.getFirstLine()); } if (tmpInd.getFirstLineChars() != null) { cellInd.setFirstLineChars(tmpInd.getFirstLineChars()); } if (tmpInd.getHanging() != null) { cellInd.setHanging(tmpInd.getHanging()); } if (tmpInd.getHangingChars() != null) { cellInd.setHangingChars(tmpInd.getHangingChars()); } if (tmpInd.getLeft() != null) { cellInd.setLeft(tmpInd.getLeft()); } if (tmpInd.getLeftChars() != null) { cellInd.setLeftChars(tmpInd.getLeftChars()); } if (tmpInd.getRight() != null) { cellInd.setRight(tmpInd.getRight()); } if (tmpInd.getRightChars() != null) { cellInd.setRightChars(tmpInd.getRightChars()); } } } }