4

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

4

1 回答 1

6

你可以试试

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

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

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

}

注意力!removeBodyElement类的方法XWPFDocument必须在循环遍历所有文档表的循环之外调用。否则,您有风险ConcurrentModificationException,因为删除一个表会影响文档中其他表的索引。

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

于 2014-07-20T16:07:32.883 回答