簡體   English   中英

Apache POI 用 Java 替換 docx 中的文本

[英]Apache POI replace text in docx with Java

我可以替換表格和頁腳內的文本,但不能替換表格外的文本。 我不知道為什么。

請知道如何替換表格外的${name}之類的段落嗎? 我希望在 Map 中使用它。

public static boolean changWord(String inputUrl, String outputUrl, Map<String, String> textMap) {

        // Template conversion default success
        boolean changeFlag = true;
        try {
            File file = new File(outputUrl);
            FileOutputStream stream = new FileOutputStream(file);
            @SuppressWarnings("resource")
            XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl));
            WorderToNewWordUtils.changeText(document, textMap);
           
            document.write(stream);
            stream.close();

        } catch (IOException e) {
            e.printStackTrace();
            changeFlag = false;
        }

        return changeFlag;

    }

    public static void changeText(XWPFDocument document, Map<String, String> textMap) {
        for (XWPFParagraph p : document.getParagraphs()) {
            for (XWPFRun r : p.getRuns()) {
               
                String text = r.getText(0);
                if (checkText(text)) {
                    r.setText(changeValue(r.toString(), textMap), 0);
                }
            }
        }

        // Replace Text inside Table
        for (XWPFTable tbl : document.getTables()) {
            for (XWPFTableRow row : tbl.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph p : cell.getParagraphs()) {
                        for (XWPFRun r : p.getRuns()) {
                            String text = r.getText(0);
                            if (checkText(text)) {
                                
                                r.setText(changeValue(r.toString(), textMap), 0);
                            }
                            // System.out.println("Bevor Fußzeiler" + text);
                        }
                    }
                }
            }
        }

        // Replace Text in Footer
        for (XWPFFooter footer : document.getFooterList()) {
            for (XWPFParagraph paragraph1 : footer.getParagraphs()) {
                for (XWPFRun r : paragraph1.getRuns()) {
                    String text = r.getText(0);
                    if (checkText(text)) {
                      
                        r.setText(changeValue(r.toString(), textMap), 0);
                    }
                    // System.out.println("Nach Fußzeile" + text);
                }
            }
        }
    }

    public static boolean checkText(String text) {
        boolean check = false;
        if (text.indexOf("$") != -1) {
            check = true;
        }
        return check;
    }
    public static String changeValue(String value, Map<String, String> textMap) {
        for (Map.Entry<String, String> textSet : textMap.entrySet()) {
            // match template and replacement value format ${key}
            String key = "${" + textSet.getKey() + "}";
           
            if (value.indexOf(key) != -1) {
                value = textSet.getValue();

            }
        }
      
        return value;

    }
    public static void main(String[] args) {
        // Template file address
        String inputUrl = "D:\\Test.docx";

        Map<String, String> testMap = new HashMap<>();

        testMap.put("ja", "Nein");
        testMap.put("red", "Blue");
        testMap.put("No", "yes");
        testMap.put("Preis", "999$");
        testMap.put("Something", "Nothing");
        testMap.put("nein", "Ja");
        testMap.put("antwort", "Schöne");       
        testMap.put("name", "Sayer");
        testMap.put("Test", "Email");
        // .pdf if you want the Document in PDF Format
        String outputUrl = "D:\\New-Test.docx";

        WorderToNewWordUtils.changWord(inputUrl, outputUrl, testMap);

    }
}

我找到了一個解決方案,如果你想要它把你的 email 發給我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM