合并表格单元格

有时,表格中的某些行需要标题或占据表格整个宽度的大文本块。为了正确设计表格,用户可以将多个表格单元格合并为一个。 Aspose.Words 在处理所有输入格式(包括导入 HTML 内容)时支持合并单元格。

如何合并表格单元格

在 Aspose.Words 中,合并单元格由 CellFormat 类的以下属性表示:

  • HorizontalMerge 描述单元格是否是单元格水平合并的一部分
  • VerticalMerge 描述单元格是否是单元格垂直合并的一部分

这些属性的值决定单元格的合并行为:

检查单元格是否合并

要检查单元格是否是合并单元格序列的一部分,我们只需检查 HorizontalMergeVerticalMerge 属性。

以下代码示例显示如何打印水平和垂直单元格合并类型:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document(MY_DIR + "Table with merged cells.docx")
table = doc.get_child(aw.NodeType.TABLE, 0, True).as_table()
for row in table.rows:
for cell in row.as_row().cells:
print(self.print_cell_merge_type(cell.as_cell()))

使用 DocumentBuilder 时合并表格单元格

要合并使用 DocumentBuilder 创建的表中的单元格,您需要为需要合并的每个单元格设置适当的合并类型 - 首先是 CellMerge.First,然后是 CellMerge.Previous

此外,您必须记住清除那些不需要合并的单元格的合并设置 - 这可以通过将第一个非合并单元格设置为 CellMerge.None 来完成。如果不这样做,表中的所有单元格将被合并。

以下代码示例演示如何创建一个包含两行的表格,其中第一行中的单元格水平合并:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.insert_cell()
builder.cell_format.horizontal_merge = aw.tables.CellMerge.FIRST
builder.write("Text in merged cells.")
builder.insert_cell()
# This cell is merged to the previous and should be empty.
builder.cell_format.horizontal_merge = aw.tables.CellMerge.PREVIOUS
builder.end_row()
builder.insert_cell()
builder.cell_format.horizontal_merge = aw.tables.CellMerge.NONE
builder.write("Text in one cell.")
builder.insert_cell()
builder.write("Text in another cell.")
builder.end_row()
builder.end_table()
doc.save(ARTIFACTS_DIR + "WorkingWithTables.horizontal_merge.docx")

以下代码示例演示如何创建一个两列表格,其中第一列中的单元格垂直合并:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
builder.insert_cell()
builder.cell_format.vertical_merge = aw.tables.CellMerge.FIRST
builder.write("Text in merged cells.")
builder.insert_cell()
builder.cell_format.vertical_merge = aw.tables.CellMerge.NONE
builder.write("Text in one cell")
builder.end_row()
builder.insert_cell()
# This cell is vertically merged to the cell above and should be empty.
builder.cell_format.vertical_merge = aw.tables.CellMerge.PREVIOUS
builder.insert_cell()
builder.cell_format.vertical_merge = aw.tables.CellMerge.NONE
builder.write("Text in another cell")
builder.end_row()
builder.end_table()
doc.save(ARTIFACTS_DIR + "WorkingWithTables.vertical_merge.docx")

其他情况下合并表格单元格

在不使用 DocumentBuilder 的其他情况下,例如在现有表格中,以以前的方式合并单元格可能不那么容易。相反,我们可以将涉及将合并属性应用于单元格的基本操作包装在一种方法中,从而使任务变得更加容易。此方法类似于合并自动化方法,调用该方法来合并表中的一系列单元格。

下面的代码将合并指定范围内的表格单元格,从给定单元格开始,到结束单元格结束。在这种情况下,范围可以跨越多行或多列:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
@staticmethod
def merge_cells(start_cell: aw.tables.Cell, end_cell: aw.tables.Cell):
parent_table = start_cell.parent_row.parent_table
# Find the row and cell indices for the start and end cell.
start_cell_pos = drawing.Point(start_cell.parent_row.index_of(start_cell), parent_table.index_of(start_cell.parent_row))
end_cell_pos = drawing.Point(end_cell.parent_row.index_of(end_cell), parent_table.index_of(end_cell.parent_row))
# Create a range of cells to be merged based on these indices.
# Inverse each index if the end cell is before the start cell.
merge_range = drawing.Rectangle(
min(start_cell_pos.x, end_cell_pos.x),
min(start_cell_pos.y, end_cell_pos.y),
abs(end_cell_pos.x - start_cell_pos.x) + 1,
abs(end_cell_pos.y - start_cell_pos.y) + 1)
for row in parent_table.rows:
row = row.as_row()
for cell in row.cells:
cell = cell.as_cell()
current_pos = drawing.Point(row.index_of(cell), parent_table.index_of(row))
# Check if the current cell is inside our merge range, then merge it.
if merge_range.contains(current_pos):
cell.cell_format.horizontal_merge = aw.tables.CellMerge.FIRST if current_pos.x == merge_range.x else aw.tables.CellMerge.PREVIOUS
cell.cell_format.vertical_merge = aw.tables.CellMerge.FIRST if current_pos.y == merge_range.y else aw.tables.CellMerge.PREVIOUS
view raw merge-cells.py hosted with ❤ by GitHub

以下代码示例演示如何合并两个指定单元格之间的单元格范围:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document(MY_DIR + "Table with merged cells.docx")
table = doc.first_section.body.tables[0]
# We want to merge the range of cells found inbetween these two cells.
cell_start_range = table.rows[0].cells[0]
cell_end_range = table.rows[1].cells[1]
# Merge all the cells between the two specified cells into one.
self.merge_cells(cell_start_range, cell_end_range)
doc.save(ARTIFACTS_DIR + "WorkingWithTables.merge_cell_range.docx")

根据您使用的框架的版本,您可能希望通过将其转换为扩展方法来完善此方法。在这种情况下,您可以直接在单元格上调用此方法来合并单元格区域,例如cell1.Merge(cell2)

转换为水平合并单元格

有时无法检测哪些单元格被合并,因为某些较新版本的 Microsoft Word 在水平合并单元格时不再使用合并标志。但对于使用合并标志将单元格按宽度水平合并为单元格的情况,Aspose.Words 提供了 ConvertToHorizontallyMergedCells 方法来转换单元格。此方法只是转换表格并根据需要添加新单元格。

下面的代码示例展示了上述方法的运行情况:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git.
doc = aw.Document(MY_DIR + "Table with merged cells.docx")
table = doc.first_section.body.tables[0]
# Now merged cells have appropriate merge flags.
table.convert_to_horizontally_merged_cells()