• 问题描述
  • 设置边框
  • 表格内容水平居中
  • 完整方法(仅参考)

不逼逼多余的废话,简单的讲讲遇到的问题,以及处理办法。

问题描述

  1. 调用createRow() 方法创建一行无样式。
  2. 调用addRow() 方法创建一行后成功添加边框,但添加的数据都挤在一行。
    个人推测是因为addRow传入的行参数来自同一对象,导致数据重复添加。
  3. 网传调用addNewRowBetween() 方法创建一行存在边框。但新版中该方法体未实现。
    个人下载了3.10.x所有包,都不存在该方法的实现。
  4. 调用insertNewTableRow() 方法创建一行无样式,并且还需要调用addNewCol() 来添加一列数据,列数必须统一,否则导出的Wrod是无法打开的。

设置边框

下面代码分别设置XWPFTable上下左右实线黑色边框,放到头部定义就好。定义完成我们就能使用createRow()添加出有边框的表格
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");

table.createRow(); // 增加一行

表格内容水平居中

这里的水平居中需针对到每一个单元格设置(可能有全局设置,只不过我不晓得)
XWPFTableCell cell = cells.get(index);

/** 设置水平居中 */
CTTc cttc = cell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);

使用此方法设置水平居中还需ooxml-schemas包,看清楚不是poi-ooxml-schemas

完整方法(仅参考)

个人使用,做个备忘录,来到这个页面的小伙伴不需要关注这里 - -
/**
  * 为表格插入数据,行数不够添加新行
  *
  * @param table     需要插入数据的表格
  * @param tableList 插入数据集合
  */
 private void insertTable(XWPFTable table, List<String[]> tableList) {
     // 添加边框
     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");

     //创建行,根据需要插入的数据添加新行,不处理表头
     for (int i = 1; i < tableList.size(); i++) {
         table.createRow();
     }

     //遍历表格插入数据
     List<XWPFTableRow> rows = table.getRows();
     for (int i = 1; i < rows.size(); i++) {
         List<XWPFTableCell> cells = rows.get(i).getTableCells();
         for (int j = 0; j < cells.size(); j++) {
             XWPFTableCell cell = cells.get(j);

             // 设置水平居中,需要ooxml-schemas包支持
             CTTc cttc = cell.getCTTc();
             CTTcPr ctPr = cttc.addNewTcPr();
             ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
             cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);

             cell.setText(tableList.get(i - 1)[j]);
         }
     }
 }

更多推荐

POI 设置Word表格边框、表格文字水平居中