How to remove / delete the table from the TableList POI

人走茶凉 提交于 2019-12-07 16:10:30

问题


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?


回答1:


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!



来源:https://stackoverflow.com/questions/19854259/how-to-remove-delete-the-table-from-the-tablelist-poi

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!