Làm việc với cột và hàng
Để kiểm soát nhiều hơn cách hoạt động của bảng, hãy tìm hiểu cách thao tác với cột và hàng.
Tìm chỉ mục phần tử bảng
Cột, hàng và ô được quản lý bằng cách truy cập vào nút tài liệu đã chọn theo chỉ mục của nó. Việc tìm chỉ mục của bất kỳ nút nào liên quan đến việc thu thập tất cả các nút con của loại phần tử từ nút cha, sau đó sử dụng phương pháp IndexOf để tìm chỉ mục của nút mong muốn trong bộ sưu tập.
Tìm chỉ mục của bảng trong tài liệu
Đôi khi bạn có thể cần thực hiện các thay đổi đối với một bảng cụ thể trong tài liệu. Để làm điều này, bạn có thể tham khảo một bảng theo chỉ mục của nó.
Ví dụ mã sau đây cho thấy cách truy xuất chỉ mục của bảng trong tài liệu:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
table = doc.get_child(aw.NodeType.TABLE, 0, True).as_table() | |
all_tables = doc.get_child_nodes(aw.NodeType.TABLE, True) | |
table_index = all_tables.index_of(table) |
Tìm chỉ mục của một hàng trong bảng
Tương tự, bạn có thể cần thực hiện thay đổi đối với một hàng cụ thể trong bảng đã chọn. Để làm điều này, bạn cũng có thể tham chiếu đến một hàng theo chỉ mục của nó.
Ví dụ mã sau đây cho thấy cách truy xuất chỉ mục của một hàng trong bảng:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
row_index = table.index_of(table.last_row) |
Tìm chỉ mục của một ô trong một hàng
Cuối cùng, bạn có thể cần thực hiện thay đổi đối với một ô cụ thể và bạn cũng có thể thực hiện việc này bằng chỉ mục ô.
Ví dụ mã sau đây cho thấy cách truy xuất chỉ mục của một ô trong một hàng:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
cell_index = row.index_of(row.cells[4]) |
Làm việc với cột
Trong Aspose.Words Document Object Model (DOM), nút Table bao gồm các nút Row và sau đó là các nút Cell. Do đó, trong Mô hình đối tượng Document
của Aspose.Words, cũng như trong tài liệu Word, không có khái niệm về cột.
Theo thiết kế, các hàng của bảng trong Microsoft Word và Aspose.Words hoàn toàn độc lập và các thuộc tính cũng như thao tác cơ bản chỉ có trong các hàng và ô của bảng. Điều này mang lại cho các bảng khả năng có một số thuộc tính thú vị:
- Mỗi hàng của bảng có thể có số ô hoàn toàn khác nhau
- Theo chiều dọc, các ô của mỗi hàng có thể có chiều rộng khác nhau
- Có thể nối các bảng với định dạng hàng và số lượng ô khác nhau
Bất kỳ thao tác nào được thực hiện trên các cột thực chất là “phím tắt” thực hiện thao tác bằng cách thay đổi chung các ô hàng theo cách trông giống như chúng đang được áp dụng cho các cột. Nghĩa là, bạn có thể thực hiện các thao tác trên các cột bằng cách lặp lại chỉ mục ô hàng của cùng một bảng.
Ví dụ mã sau đây đơn giản hóa các hoạt động như vậy bằng cách chứng minh một lớp mặt tiền thu thập các ô tạo thành một “cột” của bảng:
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET.git. | |
class Column: | |
"""Represents a facade object for a column of a table in a Microsoft Word document.""" | |
def __init__(self, table: aw.tables.Table, column_index: int): | |
if table is None: | |
raise ValueError("table") | |
self.table = table | |
self.column_index = column_index | |
def index_of(self, cell: aw.tables.Cell): | |
"""Returns the index of the given cell in the column.""" | |
return self.get_column_cells().index(cell) | |
def insert_column_before(self): | |
"""Inserts a brand new column before this column into the table.""" | |
column_cells = self.get_column_cells() | |
if len(column_cells) == 0: | |
raise ValueError("Column must not be empty") | |
# Create a clone of this column. | |
for cell in column_cells: | |
cell.parent_row.insert_before(cell.clone(False), cell) | |
# This is the new column. | |
column = self.__class__(column_cells[0].parent_row.parent_table, self.column_index) | |
# We want to make sure that the cells are all valid to work with (have at least one paragraph). | |
for cell in column.get_column_cells(): | |
cell.ensure_minimum() | |
# Increase the index which this column represents since there is now one extra column in front. | |
self.column_index += 1 | |
return column | |
def remove(self): | |
"""Removes the column from the table.""" | |
for cell in self.get_column_cells(): | |
cell.remove() | |
def to_txt(self): | |
"""Returns the text of the column.""" | |
return "".join(cell.to_string(aw.SaveFormat.TEXT) for cell in self.get_column_cells()) | |
def get_column_cells(self): | |
"""Provides an up-to-date collection of cells which make up the column represented by this facade.""" | |
column_cells = [] | |
for row in self.table.rows: | |
cell = row.as_row().cells[self.column_index] | |
if cell is not None: | |
column_cells.append(cell) | |
return column_cells | |
Ví dụ mã sau đây cho thấy cách chèn một cột trống vào bảng:
# 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 + "Tables.docx") | |
table = doc.get_child(aw.NodeType.TABLE, 0, True).as_table() | |
column = self.Column(table, 0) | |
# Print the plain text of the column to the screen. | |
print(column.to_txt()) | |
# Create a new column to the left of this column. | |
# This is the same as using the "Insert Column Before" command in Microsoft Word. | |
new_column = column.insert_column_before() | |
for cell in new_column.get_column_cells(): | |
cell.first_paragraph.append_child(aw.Run(doc, "Column Text " + str(new_column.index_of(cell)))) |
Ví dụ về mã sau đây cho biết cách xóa một cột khỏi bảng trong tài liệu:
# 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 + "Tables.docx") | |
table = doc.get_child(aw.NodeType.TABLE, 1, True).as_table() | |
column = self.Column(table, 2) | |
column.remove() |
Chỉ định hàng làm hàng tiêu đề
Bạn có thể chọn lặp lại hàng đầu tiên trong bảng làm Hàng Tiêu đề chỉ trên trang đầu tiên hoặc trên mỗi trang nếu bảng được chia thành nhiều. Trong Aspose.Words, bạn có thể lặp lại Hàng tiêu đề trên mỗi trang bằng thuộc tính HeadingFormat.
Bạn cũng có thể đánh dấu nhiều hàng tiêu đề nếu các hàng đó lần lượt nằm ở đầu bảng. Để thực hiện việc này, bạn cần áp dụng thuộc tính HeadingFormat cho các hàng này.
Ví dụ về mã sau đây cho thấy cách tạo bảng bao gồm các Hàng tiêu đề lặp lại trên các trang tiếp theo:
# 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.start_table() | |
builder.row_format.heading_format = True | |
builder.paragraph_format.alignment = aw.ParagraphAlignment.CENTER | |
builder.cell_format.width = 100 | |
builder.insert_cell() | |
builder.writeln("Heading row 1") | |
builder.end_row() | |
builder.insert_cell() | |
builder.writeln("Heading row 2") | |
builder.end_row() | |
builder.cell_format.width = 50 | |
builder.paragraph_format.clear_formatting() | |
for _ in range(50): | |
builder.insert_cell() | |
builder.row_format.heading_format = False | |
builder.write("Column 1 Text") | |
builder.insert_cell() | |
builder.write("Column 2 Text") | |
builder.end_row() | |
doc.save(ARTIFACTS_DIR + "WorkingWithTables.repeat_rows_on_subsequent_pages.docx") |
Giữ cho bảng và hàng không bị vỡ trên các trang
Đôi khi nội dung của bảng không được chia thành nhiều trang. Ví dụ: nếu tiêu đề nằm phía trên bảng thì tiêu đề và bảng phải luôn được giữ cùng nhau trên cùng một trang để duy trì hình thức phù hợp.
Có hai kỹ thuật riêng biệt hữu ích để đạt được chức năng này:
Allow row break across pages
, được áp dụng cho các hàng của bảngKeep with next
, được áp dụng cho các đoạn văn trong ô bảng
Theo mặc định, các thuộc tính trên bị tắt.
Giữ một hàng không bị vỡ trên các trang
Điều này liên quan đến việc hạn chế nội dung bên trong các ô của một hàng không bị phân chia trên một trang. Trong Microsoft Word, điều này có thể được tìm thấy trong Thuộc tính bảng dưới dạng tùy chọn “Cho phép hàng ngắt giữa các trang”. Trong Aspose.Words, điều này được tìm thấy trong đối tượng RowFormat của Row dưới dạng thuộc tính RowFormat.AllowBreakAcrossPages.
Ví dụ về mã sau đây cho biết cách tắt tính năng ngắt hàng trên các trang cho mỗi hàng trong bảng:
# 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 spanning two pages.docx") | |
table = doc.get_child(aw.NodeType.TABLE, 0, True).as_table() | |
# Disable breaking across pages for all rows in the table. | |
for row in table.rows: | |
row.as_row().row_format.allow_break_across_pages = False | |
doc.save(ARTIFACTS_DIR + "WorkingWithTables.row_format_disable_break_across_pages.docx") |
Giữ cho bảng không bị vỡ trên nhiều trang
Để ngăn bảng chia thành nhiều trang, chúng ta cần xác định rõ rằng chúng ta muốn nội dung chứa trong bảng ở cùng nhau.
Để thực hiện điều này, Aspose.Words sử dụng một phương thức cho phép người dùng chọn một bảng và kích hoạt tham số KeepWithNext thành true cho từng đoạn trong các ô của bảng. Ngoại lệ là đoạn cuối cùng trong bảng nên được đặt thành false.
Ví dụ về mã sau đây cho thấy cách đặt một bảng ở cùng nhau trên cùng một trang:
# 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 spanning two pages.docx") | |
table = doc.get_child(aw.NodeType.TABLE, 0, True).as_table() | |
# We need to enable KeepWithNext for every paragraph in the table to keep it from breaking across a page, | |
# except for the last paragraphs in the last row of the table. | |
for cell in table.get_child_nodes(aw.NodeType.CELL, True): | |
cell = cell.as_cell() | |
cell.ensure_minimum() | |
for para in cell.paragraphs: | |
para = para.as_paragraph() | |
if not (cell.parent_row.is_last_row and para.is_end_of_cell): | |
para.paragraph_format.keep_with_next = True | |
doc.save(ARTIFACTS_DIR + "WorkingWithTables.keep_table_together.docx") |