当前位置: 首页 > 知识库问答 >
问题:

Apache POI替换exampleRow中的值而不更改行本身

胥康安
2023-03-14

我有一个方法,它可以替换内部某些JSON对象键的所有出现。该方法有2个参数--一个JSON对象和一个要替换的行。在这里:

private XWPFTableRow replaceTextInARow(XWPFTableRow row, JSONObject jsonObjectToFindKeysIn) 
{
    XWPFTableRow copyOfOriginalRaw = new XWPFTableRow(row.getCtRow(), row.getTable());
    
    for (XWPFTableCell cell : copyOfOriginalRaw.getTableCells()) {
         for (XWPFParagraph p : cell.getParagraphs()) {
            for (XWPFRun r : p.getRuns()) 
            {
            String text = r.getText(0);
              if (text != null && jsonObjectToFindKeysIn.has(text))
              {
                  text = text.replace(text, jsonObjectToFindKeysIn.getString(text));
                  r.setText(text, 0);
              }
            }
         }
      }
    
    return copyOfOriginalRaw;
}

而且效果很好。我复制了原始行,原因是我不想替换原始行,如果需要,请将该行设置为该值。

然而,在这种情况下,它似乎不起作用:

XWPFTableRow exampleRow = tableToCreateRowsIn.getRow(tableToCreateRowsIn.getRows().size() - 2);

      for(int i = 0; i < allSections.length(); i++) 
      {
          System.out.println(exampleRow.getCell(0).getText());
          JSONObject particularSection = allSections.getJSONObject(i);
          XWPFTableRow replacedTableRow = replaceTextInARow(exampleRow, particularSection);
          tableToCreateRowsIn.addRow(replacedTableRow, i + 2);
      }

下面是一个示例行,如下所示:

我想对数组内的每个JSON对象使用这个示例。然而,在循环中的第一次迭代之后,exampleRow变得完全不同--此后的每个打印都成为循环中的替换值。它根据allSection数组的长度给出了行数。但是它们都是一样的,因为exampleRow已经改变了。我希望它是不变的。有什么问题?提前谢了。

共有1个答案

吕鸿轩
2023-03-14

嗯,我发现阿克塞尔·里克特的评论非常有用。所以,我已经重写了方法。现在看起来是这样的:

private XWPFTableRow replaceTextInARow(XWPFTableRow row, JSONObject richJSON, boolean createCopy) throws XmlException, IOException 
{
    XWPFTableRow copyOfOriginalRaw;

    if(createCopy) // if we want our original table row to remain intact
    {
    copyOfOriginalRaw = new XWPFTableRow(CTRow.Factory.parse(row.getCtRow().newInputStream()), row.getTable());
    }
    else copyOfOriginalRaw = row; // otherwise we replace text in the original row

    for (XWPFTableCell cell : copyOfOriginalRaw.getTableCells()) {
         for (XWPFParagraph p : cell.getParagraphs()) {
            for (XWPFRun r : p.getRuns()) 
            {
            String text = r.getText(0);             
              if (text != null && richJSON.has(text))
              {
                  if(!richJSON.getString(text).isEmpty()) 
                  {
                  text = text.replace(text, richJSON.getString(text));
                  r.setText(text, 0);
                  }
                  else r.setText("-", 0);
              }
            }
         }
      }
    return copyOfOriginalRaw;
}

我还增加了一个额外的论点。它使该方法变得非常通用--在本例中,我们可以选择是对原始表行进行更改,还是创建一个副本。谢了。

 类似资料:
  • 我试图找到一种方法来更改JTextArea组件中的行距。 稍微搜索一下似乎总是会发现相同的答案:“改用 JTextPane,然后调用 setParagraphAttributes”。 但我想知道是否有可能仅通过 JTextArea 来实现这一点,例如,弄乱字体。 使用< code>deriveFont(...)方法,可以改变字体的字距和字距,即字符之间的水平间距,但我还没能找到改变垂直间距的方法(

  • 我有一份价值观清单。如何替换Dataframe列中不在给定值列表中的所有值? 例如 我想用“无”替换数据框S列中不在允许值列表中的所有值。我该怎么做?

  • 但是当我重新加载/刷新数据库时,没有新的数据被追加到数据库中...这里是我的代码.... 当我运行它时,它显示没有错误,但数据从来没有进入数据库,我是哪里出错了?.....

  • 问题内容: 我试图通过读取每一行,对其进行测试,然后编写是否需要更新来替换文本文件中的文本。我不想另存为新文件,因为我的脚本已经先备份了文件并可以进行备份。 到目前为止,这是我所拥有的…我从os.walk()获得了fpath,并保证pathmatch var正确返回: 但是最终发生的是,我只得到了几行(正确更新,请注意,但是从文件的开头重复了)。我认为这是一个范围界定的问题。 *另外:我想知道如何

  • 寻找 代码是;制表符分隔。 注意:标题和段落从不相同。 查找: 替换为: 首先,我要感谢你的帮助

  • 问题内容: 我想动态更新元素的文本: 我是jQuery的新手,因此对我来说,这项任务似乎非常具有挑战性。有人可以指出我要使用的功能/选择器吗? 如果可能的话,我想在不为需要更改的文本添加新容器的情况下执行此操作。 问题答案: 在Javascript中,该属性为您提供元素的所有子节点,包括文本节点。 因此,如果您知道要更改的文本始终是元素中的第一件事,那么请给出以下HTML: 您可以这样做: 当然,