Java 制作包含所有内容和属性的段落的精确副本?

Java 制作包含所有内容和属性的段落的精确副本?,java,apache-poi,Java,Apache Poi,我正试图将一个段落精确地复制到另一个段落中(我将一个模板复制到一个新文档中以替换单词)。我这样做是为了表格单元格中的段落,但我认为这并不重要。以下代码几乎可以正常工作: for (XWPFParagraph p : cell.getParagraphs()) { XWPFParagraph np = newCell.addParagraph(); np.getCTP().set(p.getCTP()); } 问题是,np.getCTP().xmlText().equals(p.

我正试图将一个段落精确地复制到另一个段落中(我将一个模板复制到一个新文档中以替换单词)。我这样做是为了表格单元格中的段落,但我认为这并不重要。以下代码几乎可以正常工作:

for (XWPFParagraph p : cell.getParagraphs()) {
    XWPFParagraph np = newCell.addParagraph();
    np.getCTP().set(p.getCTP());
}
问题是,
np.getCTP().xmlText().equals(p.getCTP().xmlTest()
为真,
np.getText()
为空,而
p.getText()为空
包含段落的内容。我的段落似乎不知道我对XML所做的基本更改。这导致我的输出文档包含占位符文本,因为我的代码似乎无法再看到段落的内容以执行替换


我怎样才能制作一个包含所有内容和属性的段落的完美副本呢?

这似乎完成了任务。我不确定整个
cloneRun()
方法是否不能被
nr.getCTR().set(r.getCTR());
所取代,但这似乎比遗憾更安全

public static void cloneParagraph(XWPFParagraph clone, XWPFParagraph source) {
    CTPPr pPr = clone.getCTP().isSetPPr() ? clone.getCTP().getPPr() : clone.getCTP().addNewPPr();
    pPr.set(source.getCTP().getPPr());
    for (XWPFRun r : source.getRuns()) {
        XWPFRun nr = clone.createRun();
        cloneRun(nr, r);
    }
}

public static void cloneRun(XWPFRun clone, XWPFRun source) {
    CTRPr rPr = clone.getCTR().isSetRPr() ? clone.getCTR().getRPr() : clone.getCTR().addNewRPr();
    rPr.set(source.getCTR().getRPr());
    clone.setText(source.getText(0));
}

这似乎完成了任务。我不确定整个
cloneRun()
方法是否不能被
nr.getCTR().set(r.getCTR());
替换,但这似乎比“抱歉”更安全

public static void cloneParagraph(XWPFParagraph clone, XWPFParagraph source) {
    CTPPr pPr = clone.getCTP().isSetPPr() ? clone.getCTP().getPPr() : clone.getCTP().addNewPPr();
    pPr.set(source.getCTP().getPPr());
    for (XWPFRun r : source.getRuns()) {
        XWPFRun nr = clone.createRun();
        cloneRun(nr, r);
    }
}

public static void cloneRun(XWPFRun clone, XWPFRun source) {
    CTRPr rPr = clone.getCTR().isSetRPr() ? clone.getCTR().getRPr() : clone.getCTR().addNewRPr();
    rPr.set(source.getCTR().getRPr());
    clone.setText(source.getText(0));
}
public XWPFParagraph copypraphy(int-currentpraphindex)
{
列出段落=wordDocument.getparations();
//从列表中获取我们正在处理的任何段落
XWPFParagraph段落=段落.get(currentParagraphIndex);
XmlCursor cursor=段落.getCTP().newCursor();
//在原始段落之前插入空白段落
段落.getDocument().InsertNew段落(光标);
//制作一个完整解析的旧段落副本
XWPFParagraph newParagraph=新的XWPFParagraph((CTP)paragraph.getCTP().copy(),wordDocument);
//用我们现在的段落更新文档,用新的一个替换空白的文档,并使文档重新解析它。
//不确定原因,但必须在设置新段落之前对其进行任何修改。
wordDocument.setParagraph(新段落,当前段落索引);
返回新段落;
}
公共XWPFParagraph copyParagraph(int currentParagraphIndex)
{
列出段落=wordDocument.getparations();
//从列表中获取我们正在处理的任何段落
XWPFParagraph段落=段落.get(currentParagraphIndex);
XmlCursor cursor=段落.getCTP().newCursor();
//在原始段落之前插入空白段落
段落.getDocument().InsertNew段落(光标);
//制作一个完整解析的旧段落副本
XWPFParagraph newParagraph=新的XWPFParagraph((CTP)paragraph.getCTP().copy(),wordDocument);
//用我们现在的段落更新文档,用新的一个替换空白的文档,并使文档重新解析它。
//不确定原因,但必须在设置新段落之前对其进行任何修改。
wordDocument.setParagraph(新段落,当前段落索引);
返回新段落;
}

这正是我所需要的。非常感谢!!我正在使用此代码,并且我看到行前的间距已更改。尝试使用
np.setspaceafterlines(0)
克隆后,没有任何结果。此外,源文本使用的是泰晤士报新罗马,而目标文本使用的是Calibri。@FranciscoBouza在这方面没有花费太多时间,我唯一的建议是查看docx文件的xml源代码,看看您是否能够找出字体和行距的设置,然后查看为Poi函数专门处理这些属性。我相信我的一位同事遇到了这个问题。我将检查他是否解决了这个问题。这正是我所需要的。非常感谢!!我正在使用此代码,并且我看到行前的间距发生了更改。尝试使用
np.setpacingafterlines(0)
克隆后,没有任何结果。此外,源文本使用的是泰晤士报新罗马,而目标文本使用的是Calibri。@FranciscoBouza在这方面没有花费太多时间,我唯一的建议是查看docx文件的xml源代码,看看您是否能够找出字体和行距的设置,然后查看我相信我的一位同事遇到了这个问题。我会看看他是否解决了这个问题。