Java-通过POI给Word文档的表格增加行

目录

    • 问题描述:需要通过程序动态的给word文档中的表格添加内容
    • POI版本:3-4适用
    • 第一种方式,createRow()创建无样式行。如果想添加样式,可以通过手动设置表边框实现
    • 第二种方式(推荐)addRow(XWPFTableRow row) 方法直接创建相同样式行

问题描述:需要通过程序动态的给word文档中的表格添加内容

POI版本:3-4适用

解决方法:
POI提供了四种方法添加行:

  1. 调用createRow() 方法创建行,无样式
  2. 调用addRow(XWPFTableRow row) 方法创建,有样式
  3. 调用addNewRowBetween()方法,不生效,官方文档显示已弃用Java-通过POI给Word文档的表格增加行_第1张图片
  4. 调用insertNewTableRow() 方法创建行,无样式,并且还需要调用addNewCol() 来添加一列数据,列数必须统一,否则生成的Word无法打开,不推荐。

下面来详细说说前两种方法:

第一种方式,createRow()创建无样式行。如果想添加样式,可以通过手动设置表边框实现

注意:这种方法存在一定局限性,当word文档中存在多个表,会同时设置其他表的边框。
代码如下:

// 给表添加边框
     CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();
     CTBorder hBorder = borders.addNewInsideH();
     hBorder.setVal(STBorder.Enum.forString("single"));
     hBorder.setSz(new BigInteger("1"));
     hBorder.setColor("000000");

     CTBorder vBorder = borders.addNewInsideV();
     vBorder.setVal(STBorder.Enum.forString("single"));
     vBorder.setSz(new BigInteger("1"));
     vBorder.setColor("000000");

     CTBorder lBorder = borders.addNewLeft();
     lBorder.setVal(STBorder.Enum.forString("single"));
     lBorder.setSz(new BigInteger("1"));
     lBorder.setColor("000000");

     CTBorder rBorder = borders.addNewRight();
     rBorder.setVal(STBorder.Enum.forString("single"));
     rBorder.setSz(new BigInteger("1"));
     rBorder.setColor("000000");

     CTBorder tBorder = borders.addNewTop();
     tBorder.setVal(STBorder.Enum.forString("single"));
     tBorder.setSz(new BigInteger("1"));
     tBorder.setColor("000000");

     CTBorder bBorder = borders.addNewBottom();
     bBorder.setVal(STBorder.Enum.forString("single"));
     bBorder.setSz(new BigInteger("1"));
     bBorder.setColor("000000");

//创建行,设置内容
   XWPFTableRow row = table.createRow();
   .....

第二种方式(推荐)addRow(XWPFTableRow row) 方法直接创建相同样式行

错误用法1(直接使用表头行创建row对象,会导致该对象只能修改表头的内容,却无法修改生成行的内容):

XWPFTableRow row = new XWPFTableRow(table.getRow(0).getCtRow(),table);
//设置行内容
.....
//添加行
table.addRow(row)

错误用法2(把行添加到表里后才设置行内容,会导致行内容为空):

CTRow ctrow = CTRow.Factory.parse(table.getRow(0).getCtRow().newInputStream());//重点行
XWPFTableRow row = new XWPFTableRow(ctrow, table);
//添加行
table.addRow(row)
//设置行内容
.....

正确用法:

//复制表头行的样式
CTRow ctrow = CTRow.Factory.parse(table.getRow(0).getCtRow().newInputStream());//重点行
//创建相同样式行
XWPFTableRow row = new XWPFTableRow(ctrow, table);
//设置行内容
.....
//添加到表里
table.addRow(row)

你可能感兴趣的:(Java,java)