如何从 TableList POI 中移除/删除表格

W A*_*E Y 4 java apache-poi

我正在使用模板 docx 文件来填充每个表上的数据,但在某些情况下我不想要同一个表,无论如何使用可以删除/删除哪个 XWPFTable ?

Den*_*ASH 6

你可以试试

int position = document.getPosOfTable( table );
document.removeBodyElement( position );
Run Code Online (Sandbox Code Playgroud)

这是一个示例,您提供一个模板文件(其中包含表格),程序删除第一个表格并保存文档。

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

}
Run Code Online (Sandbox Code Playgroud)

注意力!方法removeBodyElement对的XWPFDocument类有外循环被称为通过文档的所有表内,以循环。否则,您可能会有ConcurrentModificationException,因为删除一个表会影响文档中其他表的索引。

在上面的示例中,选择要删除的表的标准很简单:文档的第一个表。提取XWPFTable要删除的另一种方法是编写一个小方法,它将获取,比如说,第一行的第一个单元格的文本(第一列的标题)等。希望这会有所帮助,祝你好运!