首先poi中XWPFTable.addNewRowBetween(start, end);是不能实现插入行功能的,poi3.11版本未实现该功能,如下图:
主要思路如下:
插入行主要分2种情况,(1)在第一行插入或者最后一行插入。(2)在表格中间插入行。
第(1)种:如果在第一行上面插入一行或者最后一行下面插入一行,不需要考虑跨行情况。
如果在第一行下面插入一行或者最后一行上面插入一行,需要考虑跨行情况。
不管那一行插入都需要考虑跨列情况。
第(2)种:在中间插入,若当前行结束跨行,则上一行插入需要跨行,下一行插入不需跨行。
在中间插入,若当前行开始跨行,则下一行插入需要跨行,上一行插入不需跨行。
说下关键代码:
插入行可以使用insertNewTableRow,在下面插入一行时需参照下一行单元格是否跨行,按位置得到真实单元格代码如下:
/** * @Description:按位置得到单元格(考虑跨列合并情况) */ public XWPFTableCell getCellSizeWithMergeNum(XWPFTableRow row, int position) { List<XWPFTableCell> rowCellList = row.getTableCells(); int k = 0; for (int i = 0, len = rowCellList.size(); i < len; i++) { CTTc ctTc = rowCellList.get(i).getCTTc(); if (ctTc.isSetTcPr()) { CTTcPr tcPr = ctTc.getTcPr(); if (tcPr.isSetGridSpan()) { CTDecimalNumber gridSpan = tcPr.getGridSpan(); k += gridSpan.getVal().intValue() - 1; } } if (k >= position) { return rowCellList.get(i); } k++; } if (position < rowCellList.size()) { return rowCellList.get(position); } return null; }
其他部分自己实现了。
全文完。