该篇文章主要讲述了,如何在创建好的表格上再做合并动作。
我们知道NPOI 的XWPFTable的row提供了MergeCells这个功能,该功能可以实现单行的已存在的单元格的合并,和set gridspan值不一样的是,它不会创建出新的单元格。
但是XWPFTable没有合并多行的方法,这时候我们需要借助CT_Tc 也就是NPOI中表格单元格的另一种表示形式,这种形式可以让你设置单元格的属性(通过将docx解压开,在docx.xml中可以看到,这里不详说了)。
此时,我们给单元格加上Vmerge的属性就可以了。第一个单元格是restart,后面的是continue。
通过先合并多列,再合并行,我们就能达到合并一个区域的效果。示例代码如下:
public static XWPFTableCell MYMergeCells(XWPFTable table, int fromCol, int toCol, int fromRow, int toRow)
{
for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++)
{
if (fromCol < toCol)
{
table.GetRow(rowIndex).MergeCells(fromCol, toCol);
}
XWPFTableCell rowcell = table.GetRow(rowIndex).GetCell(fromCol);
CT_Tc cttc = rowcell.GetCTTc();
if (cttc.tcPr == null)
{
cttc.AddNewTcPr();
}
if (rowIndex == fromRow)
{
// The first merged cell is set with RESTART merge value
rowcell.GetCTTc().tcPr.AddNewVMerge().val = ST_Merge.restart;
}
else
{
// Cells which join (merge) the first one, are set with CONTINUE
rowcell.GetCTTc().tcPr.AddNewVMerge().val = ST_Merge.@continue;
}
}
table.GetRow(fromRow).GetCell(fromCol).SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
table.GetRow(fromRow).GetCell(fromCol).Paragraphs[0].Alignment = ParagraphAlignment.CENTER;
return table.GetRow(fromRow).GetCell(fromCol);
}