Как удалить первый символ после таблицы, используя POI - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь отформатировать документ Word с несколькими таблицами. Мне нужно удалить разрывы строк, которые происходят после таблицы. Как мне достичь этого программно в Java?

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

org.apache.xmlbeans.XmlCursor cursor = xwpfTable.getCTTbl().newCursor();
cursor.toEndToken();
cursor.toNextToken();
cursor.removeChars(2);

Дальнейшее разъяснение: Мы получают файлы неформатированного слова из внешнего источника. Нам нужно исключить абзац (дополнительные строки между таблицами), когда в таблице только 1 строка. В настоящее время я использую макрос и достигаю его с помощью кода:

For Each t In doc.Tables
        Set myrange = doc.Characters(t.Range.End + 1)            
        If myrange.Text = Chr(13) Then
            myrange.Delete
        End If

Заранее спасибо

Что я пытаюсь удалить: What I am trying to remove

1 Ответ

0 голосов
/ 20 января 2020

Согласно вашему скриншоту вы хотите удалить пустые абзацы, которые размещаются сразу после таблиц.

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

В любом случае, как говорится, удаление пустых абзацев после таблиц возможно. Для этого вы можете просмотреть элементы body документа. Если сразу за XWPFTable следует XWPFParagraph, а в этом XWPFParagraph нет текста, то удалите этот XWPFParagraph из документа.

Пример:

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

public class WordRemoveEmptyParagraphs {

 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument(new FileInputStream("./WordTables.docx"));

  int thisBodyElementPos = 0;
  int nextBodyElementPos = 1;
  IBodyElement thisBodyElement = null;
  IBodyElement nextBodyElement = null;
  if (document.getBodyElements().size() > 1) { // document must have at least two body elements
   do {
    thisBodyElement = document.getBodyElements().get(thisBodyElementPos);
    nextBodyElement = document.getBodyElements().get(nextBodyElementPos);
    if (thisBodyElement instanceof XWPFTable && nextBodyElement instanceof XWPFParagraph) {
     XWPFParagraph paragraph = (XWPFParagraph)nextBodyElement;
     if (paragraph.getRuns().size() == 0) { // if paragraph does not have any text runs in it
      document.removeBodyElement(nextBodyElementPos);
     }
    }
    thisBodyElementPos++;
    nextBodyElementPos = thisBodyElementPos + 1;
   } while (nextBodyElementPos < document.getBodyElements().size());
  }

  FileOutputStream out = new FileOutputStream("./WordTablesChanged.docx");
  document.write(out);
  out.close();
  document.close();
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...