如何从 TableList POI 中移除/删除表格 [英] How to remove / delete the table from the TableList POI

查看:26
本文介绍了如何从 TableList POI 中移除/删除表格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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?

推荐答案

你可以试试

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

}

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

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.

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

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!

这篇关于如何从 TableList POI 中移除/删除表格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆