/**
* 合并单元格
*
* @param table 表格对象
* @param beginRowIndex 开始行索引
* @param endRowIndex 结束行索引
* @param colIndex 合并列索引
*/
public static void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) {
if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) {
return;
}
//合并行单元格的第一个单元格
CTVMerge startMerge = CTVMerge.Factory.newInstance();
startMerge.setVal(STMerge.RESTART);
//合并行单元格的第一个单元格之后的单元格
CTVMerge endMerge = CTVMerge.Factory.newInstance();
endMerge.setVal(STMerge.CONTINUE);
table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge);
for (int i = beginRowIndex + 1; i <= endRowIndex; i++) {
table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge);
}
上述代码在合并单元格时,其实是有问题的。举个例子,如果你先调用此方法合并了第一行与第二行,此时如果再次调用此方法合并了第二行与第三行,那么最终呈现出来的是只合并了第二行与第三行,简而言之就是涉及同一行时,多次合并会覆盖合并效果。所以需要你提前计算出要合并的行坐标,根据相同数据的坐标组,再循环调用此方法,这样就不会产生覆盖问题。
详情参考:获取list中相邻且相等的元素下标组(开始下标与结束下标)-CSDN博客
所以具体做法是:
解析这个word文档,获取XWPFDocument 对象 doc
---->获取doc中所有XWPFtable tableList(word中所有的涉及表格的信息)
--->循环tableList
--->获取table中text,找出需要合并的表格(这一步text是指word中表格的表头等信息)
--->根据列数循环
--->根据列坐标找出每一行数据text的List
---->获取list中相邻且相等的元素下标组(开始下标与结束下标)
--->调用合并单元格方法。