1. 程式人生 > 其它 >POI 替換word中的表格excel內容

POI 替換word中的表格excel內容

方法一、

注意:1.替換文字的佔位符為 ${xxx} ,在word中填寫的時候,需要一次性輸入,最好是在text編輯器中寫好,然後複製過去。否則可能會被識別為 ${,xxx,}  ,就無法替換了。 

package org.jeecg.modules.utils;
 
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.xwpf.usermodel.
*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Set; @Slf4j public class WordExportUtil { /** * @param inputStream 模板檔案流 * @param textMap 待寫入字元map * @return 新檔案流
*/ public static InputStream changWord(InputStream inputStream, Map<String, String> textMap) { try { //讀取模板資訊,替換指定位置字元 XWPFDocument document = new XWPFDocument(inputStream); if (!WordExportUtil.changeText(document, textMap)) { return
null; } //新檔案(XWPFDocument)轉成檔案流 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); document.write(byteArrayOutputStream); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); return byteArrayInputStream; } catch (Exception e) { log.warn("word寫入資料異常: "+ JSONUtil.toJsonStr(textMap)); log.warn(e.getMessage()); } return null; } /** * 替換文字 * * @param document docx解析物件 * @param valueMap 待寫入字元map */ public static Boolean changeText(XWPFDocument document, Map<String, String> valueMap) { List<XWPFParagraph> paragraphs = document.getParagraphs(); if (CollectionUtil.isEmpty(paragraphs)) { return false; } for (XWPFParagraph paragraph : paragraphs) { String text = paragraph.getText(); if (StringUtils.isBlank(text)) { continue; } if (text.indexOf("$") == -1) { continue; } List<XWPFRun> runs = paragraph.getRuns(); for (XWPFRun run : runs) { String value = setWordValue(run.toString(), valueMap); run.setText(value, 0); } } List<XWPFTable> tables = document.getTables(); if (CollectionUtil.isEmpty(tables)) { return false; } for (XWPFTable table : tables) { String text = table.getText(); if (StringUtils.isBlank(text)) { continue; } if (text.indexOf("$") == -1) { continue; } //String value = setWordValue(table.getText(), valueMap); changeTableMessage(valueMap,table,false,null); } return true; } /** * word中的表格文字替換 */ public static void changeTableMessage(Map<String, String> params, XWPFTable table, boolean isBold, Integer fontSize) { int count = table.getNumberOfRows();//獲取table的行數 for (int i = 0; i < count; i++) { XWPFTableRow row = table.getRow(i); List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) {//遍歷每行的值並進行替換 System.out.println(cell.getText()); for (Map.Entry<String, String> e : params.entrySet()) { if (cell.getText().equals("${" + e.getKey() + "}")) { XWPFParagraph newPara = new XWPFParagraph(cell.getCTTc().addNewP(), cell); XWPFRun r1 = newPara.createRun(); r1.setBold(isBold); if (fontSize != null) { r1.setFontSize(fontSize); } r1.setText(e.getValue()); cell.removeParagraph(0); cell.setParagraph(newPara); } } } } } /** * 匹配傳入資訊集合與模板 * @param value 模板需要替換的區域 * @param textMap 傳入資訊集合 * @return 模板需要替換區域資訊集合對應值 */ public static String setWordValue(String value, Map<String, String> textMap) { Set<Map.Entry<String, String>> textSets = textMap.entrySet(); for (Map.Entry<String, String> textSet : textSets) { String key = "${" + textSet.getKey() + "}"; if (value.indexOf(key) != -1) { value = textSet.getValue(); } } return value; } }

方法二、

保持原有的樣式

注意:1.表格內部引數,儘量不要一個格子有多個變數,儘可能的拆分。同時單元格中儘量不要主動回車換行。

   public static void changeTableMessage(Map<String, String> valueMap, XWPFTable table) {
        int count = table.getNumberOfRows();//獲取table的行數
        for (int i = 0; i < count; i++) {
            XWPFTableRow row = table.getRow(i);
            List<XWPFTableCell> cells = row.getTableCells();
            for (XWPFTableCell cell : cells) {//遍歷每行的值並進行替換
                    if (cell.getText().indexOf("$") == -1) {
                        continue;
                    }
                    for (XWPFParagraph paragraph : cell.getParagraphs()) {
                        String text = paragraph.getText();
                        if (StringUtils.isBlank(text)) {
                            continue;
                        }
                        if (text.indexOf("$") == -1) {
                            continue;
                        }
                        List<XWPFRun> runs = paragraph.getRuns();
                        for (XWPFRun run : runs) {
                            String value = setWordValue(run.toString(), valueMap);
                            run.setText(value, 0);
                        }
                    }
            }
        }
    }
    /**
     * 匹配傳入資訊集合與模板
     * @param value   模板需要替換的區域
     * @param textMap 傳入資訊集合
     * @return 模板需要替換區域資訊集合對應值
     */
    public static String setWordValue(String value, Map<String, String> textMap) {
        Set<Map.Entry<String, String>> textSets = textMap.entrySet();
        for (Map.Entry<String, String> textSet : textSets) {
            String key = "${" + textSet.getKey() + "}";
            if (value.indexOf(key) != -1) {
                value = value.replace(key,textSet.getValue());
            }
        }
        return value;
    }

 

借鑑部落格:https://blog.csdn.net/yyfjm1994/article/details/118547570?spm=1001.2014.3001.5502