4

I am using a template docx file to fill the data on each table, but in some cases I don't want same table, is there anyway using which XWPFTable can be deleted / removed?

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
W A K A L E Y
  • 817
  • 1
  • 10
  • 14
  • You could also take a look at a [similar question](http://stackoverflow.com/questions/21968813/how-to-remove-tables-and-paragraphs-containing-data-from-docx-in-java-using-apac). If the answer below solves your problem, please accept it with a green mark. Thank you! – DenisFLASH Jul 21 '14 at 06:58

1 Answers1

7

You can try

int position = document.getPosOfTable( table );
document.removeBodyElement( position );

Here is an example, in which you provide a template file (with tables in it), the program deletes the first table and saves the document.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;

public class TableTest {

    public static void main( String[] args ) {

        String filename = "template.docx";

        try {
            FileInputStream in = new FileInputStream( new File( filename ) );
            XWPFDocument document = new XWPFDocument( in );

            showTablesInfo( document );

            // Deleting the first table of the document
            deleteOneTable( document, 0 );

            showTablesInfo( document );

            saveDoc( document, "template after processing.docx" );

        } catch ( FileNotFoundException e ) {
            System.out.println( "File " + filename + " not found." );
        } catch ( IOException e ) {
            System.out.println( "IOException while processing file " + filename + ":\n" + e.getMessage() );
        }
    }

    private static void showTablesInfo( XWPFDocument document ) {
        List<XWPFTable> tables = document.getTables();
        System.out.println( "\n document has " + tables.size() + " table(s)." );

        for ( XWPFTable table : tables ) {
            System.out.println( "\t table with position #" + document.getPosOfTable( table ) + " has "
                    + table.getRows().size() + " rows" );
        }
    }

    /**
     * Deletes a table, given its relative position in document.
     */
    private static void deleteOneTable( XWPFDocument document, int tableIndex ) {
        try {
            int bodyElement = getBodyElementOfTable( document, tableIndex );
            System.out.println( "deleting table with bodyElement #" + bodyElement );
            document.removeBodyElement( bodyElement );
        } catch ( Exception e ) {
            System.out.println( "There is no table #" + tableIndex + " in the document." );
        }
    }

    private static int getBodyElementOfTable( XWPFDocument document, int tableNumberInDocument ) {
        List<XWPFTable> tables = document.getTables();
        XWPFTable theTable = tables.get( tableNumberInDocument );

        return document.getPosOfTable( theTable );
    }

    private static void saveDoc( XWPFDocument document, String filename ) {
        try {
            FileOutputStream out = new FileOutputStream( new File( filename ) );
            document.write( out );
            out.close();
        } catch ( FileNotFoundException e ) {
            System.out.println( e.getMessage() );
        } catch ( IOException e ) {
            System.out.println( "IOException while saving to " + filename + ":\n" + e.getMessage() );
        }
    }

}

Attention! Method removeBodyElement of the XWPFDocument class has to be called outside the loop which cycles through all the document's tables. Otherwise, you risk to have ConcurrentModificationException, as deleting one table will affect the indices of other tables in the document.

In the above example the criteria of selecting a table to delete is simple: the first table of the document. Another way to extract the XWPFTable to delete, is writing a small method which will be getting, let's say, text of the first cell of the first line (title of the first column), etc. Hope this will help, good luck!

DenisFLASH
  • 734
  • 1
  • 9
  • 14