Java 使用ApachePOI替换表单元格中文本的好方法

Java 使用ApachePOI替换表单元格中文本的好方法,java,apache-poi,Java,Apache Poi,我有一个方法可以替换单个XWPFTableCell中的文本。我以前见过这样做的正确方法: for (XWPFTable tbl : doc.getTables()) { for (XWPFTableRow row : tbl.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { for (XWPFParagraph p : cell.getParagraphs()) {

我有一个方法可以替换单个XWPFTableCell中的文本。我以前见过这样做的正确方法:

for (XWPFTable tbl : doc.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 (text != null && text.contains("needle")) {
                text = text.replace("needle", "haystack");
                r.setText(text,0);
              }
            }
         }
      }
   }
}
但这些内部循环真的让我心烦意乱。所以我决定写几乎相同的方法,看起来就像这样,但只针对一个单元格

这是:

private void replaceSimpleText(XWPFTableCell cellToChangeTextIn, String textToReplaceOn) //There must be a better way...
{
    List<XWPFRun> allRunners = cellToChangeTextIn.getParagraphs().get(0).getRuns();

    for (XWPFRun r : allRunners) 
    {
          r.setText("", 0);
    }

    XWPFRun runner = allRunners.get(0);
    String text = runner.getText(0);    
    text = text.replace(text, textToReplaceOn);
    runner.setText(text, 0);

}
但不幸的是,如果我使用以下数据执行此操作:

replaceSimpleText(row.getCell(1), "test");

它给我一行“testtest”。它等于XWPFRun集合(5)的大小。为什么会这样?我错过什么了吗?提前感谢。

您的文本可能会被分为几段,这取决于MS Word在保存时的感受……如果需要用Word中的文本替换占位符,例如,将Doe作为$SURENAME,将John作为$GIVENNAME,然后,最佳实践是在Word文档中不使用占位符作为文本,而是在Word文档中使用占位符作为字段。读一下::。这些字段不能拆分为单个文本运行,因此始终可以正确填充。
replaceSimpleText(row.getCell(1), "test");