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?
-
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 Answers
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!

- 734
- 1
- 9
- 14