Apache POI, заменяющий значения внутри exampleRow без изменения самой строки - PullRequest
0 голосов
/ 05 июля 2018

У меня есть метод, который заменяет все вхождения некоторых ключей объекта 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);
      }

Вот пример строки, которая выглядит следующим образом:

enter image description here

Я хочу использовать этот пример для каждого объекта JSON внутри массива. Однако после самой первой итерации в цикле exampleRow становится совершенно другим - с тех пор каждый вывод становится замененным значением внутри цикла. И это дает мне количество строк, основанных на длине массива allSection. Но они все одинаковые, так как exampleRow изменился. Я хочу, чтобы он был неизменным. В чем проблема? Заранее спасибо.

1 Ответ

0 голосов
/ 05 июля 2018

Ну, я нашел комментарий Акселя Рихтера очень полезным. Итак, я переписал метод. Теперь это выглядит так:

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;
}

Я также добавил дополнительный аргумент. Это делает метод действительно универсальным - в этом случае мы можем выбрать, хотим ли мы внести изменения в исходную строку таблицы или вместо этого создать копию. Спасибо.

...