ادغام سلول های جدول

گاهی اوقات ردیف های خاصی در یک جدول نیاز به عنوان یا بلوک های بزرگ متن دارند که تمام عرض جدول را اشغال می کند. برای طراحی مناسب جدول، کاربر می تواند چندین خانه جدول را در یک ادغام کند. Aspose.Words از سلول های ادغام شده هنگام کار با همه فرمت های ورودی، از جمله وارد کردن محتوای HTML پشتیبانی می کند.

نحوه ادغام سلول های جدول

در Aspose.Words، سلول های ادغام شده با ویژگی های زیر از کلاس CellFormat نشان داده می شوند:

  • HorizontalMerge که توضیح می دهد که آیا سلول بخشی از ادغام افقی سلول ها است
  • VerticalMerge که توضیح می دهد که آیا سلول بخشی از ادغام عمودی سلول ها است

مقادیر این ویژگی ها رفتار ادغام سلول ها را تعیین می کند:

  • اولین سلول در دنباله ای از سلول های ادغام شده دارای CellMerge.First خواهد بود
  • هر سلول ادغام شده بعدی دارای CellMerge.Previous خواهد بود
  • سلولی که ادغام نشده باشد دارای CellMerge.None خواهد بود

بررسی کنید که سلول ادغام شده است یا خیر

برای بررسی اینکه آیا یک سلول بخشی از دنباله ای از سلول های ادغام شده است، ما به سادگی ویژگی های HorizontalMerge و VerticalMerge را بررسی می کنیم.

مثال کد زیر نحوه چاپ نوع ادغام سلول های افقی و عمودی را نشان می دهد:

# 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 استفاده نمی‌شود، مانند جدول موجود، ادغام سلول‌ها به روش قبلی ممکن است به آسانی نباشد. درعوض، می‌توانیم عملیات اساسی مربوط به اعمال ویژگی‌های ادغام در سلول‌ها را به روشی بپیچیم که کار را بسیار آسان‌تر کند. این روش شبیه به روش اتوماسیون Merge است که برای ادغام محدوده ای از سلول ها در یک جدول نامیده می شود.

کد زیر سلول های جدول را در محدوده مشخص شده ادغام می کند که از سلول داده شده شروع می شود و به سلول انتهایی ختم می شود. در این مورد، محدوده می تواند چندین ردیف یا ستون را در بر بگیرد:

# 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()