在 docx4j 的 VariableReplace 中插入换行符

Insert line breaks in VariableReplace in docx4j

我一直在尝试填写一个 word 模板 (.docx) 文件,其中包含需要替换的占位符。

我能够重写模板,但文本没有换行符 我知道回车 return 或换行符 (\r\n) 在 .docx 文件中不起作用。我使用 VariableReplace 方法进行转换,但在使用变量 replace.

时无法放置 br 或 factory.createBr()

任何建议都会很有帮助。下面是我试过的代码

    Map<String,String> variableReplaceMap = new HashMap<>();
    Map<String, String> textContent = readTextContentAfterDBExtractionToFillUpTemplate();
    ObjectFactory factory = Context.getWmlObjectFactory();
    P para = factory.createP();
    R rspc = factory.createR();

    String power= textContent.get("Power & Energy");
    String[] powerWithNewLine = skills.split("\\n");
    for (String eachLineOfPower : powerWithNewLine) {

        Text eachLineOfPowerTxt = factory.createText();
        eachLineOfPowerTxt .setValue( eachLineOfPower );
        rspc.getContent().add( eachLineOfPowerTxt );
        Br br = factory.createBr(); 
        rspc.getContent().add(br);
        para.getParagraphContent().add(rspc);
        documentPart.addObject(para);
    }
    String str = "";
    for (Object eachLineOfPgrph : para.getParagraphContent()) {
        str = str + eachLineOfPgrph;
    }
    variableReplaceMap.put("POWER", str);
    return variableReplaceMap;

参见 https://github.com/plutext/docx4j/blob/master/src/samples/docx4j/org/docx4j/samples/VariableReplace.java#L122

处的 newlineToBreakHack 方法

Jason 的 link 已经死了。 这是当前的link:https://github.com/plutext/docx4j/blob/master/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/VariableReplace.java

以防将来更改,只需使用以下函数并将其应用于包含换行符的字符串:

/**
 * Hack to convert a new line character into w:br.
 * If you need this sort of thing, consider using 
 * OpenDoPE content control data binding instead.
 *  
 * @param r
 * @return
 */
private static String newlineToBreakHack(String r) {

    StringTokenizer st = new StringTokenizer(r, "\n\r\f"); // tokenize on the newline character, the carriage-return character, and the form-feed character
    StringBuilder sb = new StringBuilder();
    
    boolean firsttoken = true;
    while (st.hasMoreTokens()) {                        
        String line = (String) st.nextToken();
        if (firsttoken) {
            firsttoken = false;
        } else {
            sb.append("</w:t><w:br/><w:t>");
        }
        sb.append(line);
    }
    return sb.toString();   
}