Bekerja dengan Kolom dan Baris
Untuk kontrol lebih besar terhadap cara kerja tabel, pelajari cara memanipulasi kolom dan baris.
Menemukan Indeks Elemen Tabel
Kolom, baris, dan sel dikelola dengan mengakses node dokumen yang dipilih berdasarkan indeksnya. Menemukan indeks dari setiap node melibatkan pengumpulan semua node anak dari tipe elemen dari node induk, dan kemudian menggunakan metode IndexOf untuk menemukan indeks dari node yang diinginkan dalam koleksi.
Menemukan Indeks Tabel dalam Dokumen
Terkadang Anda mungkin perlu membuat perubahan pada tabel tertentu dalam dokumen. Untuk melakukan ini, Anda bisa merujuk ke tabel berdasarkan indeksnya.
Contoh kode berikut menunjukkan cara mengambil indeks tabel dalam dokumen:
# 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) |
Menemukan Indeks suatu Baris dalam Tabel
Demikian pula, Anda mungkin perlu membuat perubahan pada baris tertentu dalam tabel yang dipilih. Untuk melakukan ini, Anda juga dapat merujuk ke baris berdasarkan indeksnya.
Contoh kode berikut menunjukkan cara mengambil indeks baris dalam tabel:
# 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) |
Menemukan Indeks Sel dalam Satu Baris
Terakhir, Anda mungkin perlu membuat perubahan pada sel tertentu, dan Anda juga dapat melakukannya dengan indeks sel.
Contoh kode berikut menunjukkan cara mengambil indeks sel dalam satu baris:
# 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]) |
Bekerja dengan Kolom
Dalam Aspose.Words Document Object Model (DOM), node Table terdiri dari node Row dan kemudian node Cell. Jadi, dalam Model Objek Document
Aspose.Words, seperti dalam dokumen Word, tidak ada konsep kolom.
Secara desain, baris tabel di Microsoft Word dan Aspose.Words sepenuhnya independen, dan properti serta operasi dasar hanya terdapat di baris dan sel tabel. Hal ini memberikan tabel kemampuan untuk memiliki beberapa atribut menarik:
- Setiap baris tabel dapat memiliki jumlah sel yang sangat berbeda
- Secara vertikal, sel setiap baris dapat memiliki lebar berbeda
- Dimungkinkan untuk menggabungkan tabel dengan format baris dan jumlah sel berbeda
Setiap operasi yang dilakukan pada kolom sebenarnya adalah “pintasan” yang melakukan operasi dengan mengubah sel baris secara kolektif sedemikian rupa sehingga terlihat seperti diterapkan pada kolom. Artinya, Anda dapat melakukan operasi pada kolom hanya dengan melakukan iterasi pada indeks sel baris tabel yang sama.
Contoh kode berikut menyederhanakan operasi tersebut dengan membuktikan kelas fasad yang mengumpulkan sel-sel yang membentuk “kolom” tabel:
# 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 | |
Contoh kode berikut menunjukkan cara menyisipkan kolom kosong ke dalam tabel:
# 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)))) |
Contoh kode berikut memperlihatkan cara menghapus kolom dari tabel di dokumen:
# 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() |
Tentukan Baris sebagai Baris Header
Anda dapat memilih untuk mengulang baris pertama dalam tabel sebagai Baris Header hanya pada halaman pertama atau pada setiap halaman jika tabel dipecah menjadi beberapa. Di Aspose.Words, Anda dapat mengulang Baris Header di setiap halaman menggunakan properti HeadingFormat.
Anda juga dapat menandai beberapa baris header jika baris tersebut terletak satu demi satu di awal tabel. Untuk melakukan ini, Anda perlu menerapkan properti HeadingFormat ke baris ini.
Contoh kode berikut menunjukkan cara membuat tabel yang menyertakan Baris Header yang berulang di halaman berikutnya:
# 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") |
Jaga agar Tabel dan Baris tidak Terpecah di Halaman
Ada kalanya isi tabel tidak boleh dipecah menjadi beberapa halaman. Misalnya, jika judul berada di atas tabel, judul dan tabel harus selalu diletakkan bersamaan pada halaman yang sama untuk menjaga tampilan yang tepat.
Ada dua teknik terpisah yang berguna untuk mencapai fungsi ini:
Allow row break across pages
, yang diterapkan pada baris tabelKeep with next
, yang diterapkan pada paragraf di sel tabel
Secara default, properti di atas dinonaktifkan.
Cegah Satu Baris agar Tidak Melanggar Halaman
Hal ini melibatkan pembatasan konten di dalam sel-sel baris agar tidak dipecah menjadi satu halaman. Di Microsoft Word, ini dapat ditemukan di bawah Properti Tabel sebagai opsi “Izinkan baris untuk dipecah melintasi halaman”. Di Aspose.Words ini ditemukan di bawah objek RowFormat Row sebagai properti RowFormat.AllowBreakAcrossPages.
Contoh kode berikut menunjukkan cara menonaktifkan baris pemisah di seluruh halaman untuk setiap baris dalam tabel:
# 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") |
Jaga agar Tabel tidak Melanggar Halaman
Untuk menghentikan tabel agar tidak terpecah menjadi beberapa halaman, kita perlu menentukan bahwa kita ingin konten yang terdapat dalam tabel tetap bersama.
Untuk melakukan hal ini, Aspose.Words menggunakan metode yang memungkinkan pengguna memilih tabel dan mengaktifkan parameter KeepWithNext ke true untuk setiap paragraf dalam sel tabel. Pengecualiannya adalah paragraf terakhir dalam tabel, yang harus disetel ke false.
Contoh kode berikut menunjukkan cara mengatur tabel agar tetap bersama di halaman yang sama:
# 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") |