背景:给出数据,在 word 生成 table 表格,想要把某个范围内单元格内容相同的合并起来。
要求:
1. 前几行表头内容相同的单元格需要合并起来
2.前几列内容相同的单元格需要合并起来
代码:pom文件为poi最新版本5.2.0
/**
* 合并单元格 指定列 行截止 默认起止行列 都为第0行,第0列
*
* @param table table 表格
* @param numRows 指定截止行数
* @param numCols 指定截止列数
*/
public static void mergeTable(XWPFTable table, int numRows, int numCols) {
// 创建一个二维数组来保存每个单元格的内容
String[][] cellContents = new String[numRows][numCols];
// 遍历每个单元格,保存内容到二维数组
for (int row = 0; row < numRows; row++) {
XWPFTableRow tableRow = table.getRow(row);
List<XWPFTableCell> tableCells = tableRow.getTableCells();
for (int col = 0; col < numCols; col++) {
XWPFTableCell tableCell = tableCells.get(col);
cellContents[row][col] = tableCell.getText();
}
}
// 合并相同内容的单元格
for (int row = 0; row < numRows; row++) {
for (int col = 0; col < numCols; col++) {
String cellContent = cellContents[row][col];
if (cellContent != null && !cellContent.isEmpty()) {
int rowspan = 1;
int colspan = 1;
// 检查下一行是否有相同内容的单元格
for (int nextRow = row + 1; nextRow < numRows; nextRow++) {
if (cellContent.equals(cellContents[nextRow][col])) {
rowspan++;
// 清空下一行的内容
cellContents[nextRow][col] = null;
} else {
break;
}
}
// 检查下一列是否有相同内容的单元格
for (int nextCol = col + 1; nextCol < numCols; nextCol++) {
if (cellContent.equals(cellContents[row][nextCol])) {
colspan++;
// 清空下一列的内容
cellContents[row][nextCol] = null;
} else {
break;
}
}
// 合并单元格
XWPFTableCell cell = table.getRow(row).getCell(col);
// 设置合并单元格的属性
CTTcPr tcPr = cell.getCTTc().getTcPr();
if (tcPr == null) {
tcPr = cell.getCTTc().addNewTcPr();
}
tcPr.addNewVMerge().setVal(STMerge.RESTART);
tcPr.addNewHMerge().setVal(STMerge.RESTART);
// 设置合并单元格的跨度
for (int i = 0; i < rowspan - 1; i++) {
table.getRow(row + i + 1).getCell(col).getCTTc().getTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
for (int i = 0; i < colspan - 1; i++) {
table.getRow(row).getCell(col + i + 1).getCTTc().getTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
}
}
例如:想要如下效果
// 合并重复的单元格(一行七列) WordTableMergeUtils.mergeTable(table, 1, 7); 即可达到效果
// 合并单元格(一行三列) WordTableMergeUtils.mergeTable(table,1, 3);
// 合并单元格(三行第一列) WordTableMergeUtils.mergeTable(table, 3, 1);