Prasanth P J
Prasanth P J

Reputation: 7

How to delete first character after table using POI

I am attempting to format a Word document that has multiple tables. I need to delete line breaks that occur after table. How to i achieve this programatically in Java ?

I am currently trying it with the following code and it does not work

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

Further Clarification : We are receiving non-formatted word files from external source. We need to eliminate paragraph (extra lines in-between tables) when the table has only 1 row. Currently I are using a macro and achieving this by code :

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

Thanks in advance

What I am trying to remove: What I am trying to remove

Upvotes: 0

Views: 468

Answers (1)

Axel Richter
Axel Richter

Reputation: 61852

According to your screenshot you wants to remove empty paragraphs which are placed immediately after tables.

This is possible, although i am wondering why those paragraphs are there. After removing those paragraphs, in Word the tables are not more editable as single tables but only as rows within one table. Is this what you want?

Anyway, as said removing the empty paragraphs after the tables is possible. To do so, you could traversing the body elements of the document. If there is a XWPFTable immediately followed by a XWPFParagraph and this XWPFParagraph does not have any text runs in it, then remove that XWPFParagraph from the document.

Example:

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

Upvotes: 0

Related Questions