我正在使用模板 docx 文件来填充每个表上的数据,但在某些情况下我不想要同一个表,是否有使用哪个 XWPFTable 可以删除/删除?
问问题
4351 次
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 回答