Работа с колони и редове
За повече контрол върху това как работят таблиците, научете се как да манипулирате колони и редове.
Търсене на индекс на елемента на таблица
Колони, редове и клетки се управляват чрез достъп до избрания документен възел чрез неговия индекс. Намирането на индекс на всеки възел включва събиране на всички детски възли от типа елемент от базовия възел, и след това използване на IndexOf метод за намиране на индекса на желания възел в колекцията.
Намерете индекса на таблица в документ
Понякога може да се наложи да направите промени в определена таблица в документ. За да направите това, можете да се позовавате на таблица по нейния индекс.
Следният пример за код показва как да се извлече индексът на таблица в документ:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Table table = (Table) doc.GetChild(NodeType.Table, 0, true); | |
NodeCollection allTables = doc.GetChildNodes(NodeType.Table, true); | |
int tableIndex = allTables.IndexOf(table); |
Намерете индекс на ред в таблица
По същия начин, може да се наложи да направите промени в определен ред в избрана таблица. За да направите това, можете да се обърнете към ред по неговия индекс.
Следният пример за код показва как да се извлече индексът на ред в таблица:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
int rowIndex = table.IndexOf(table.LastRow); |
Намерете индекс на клетка в ред
И накрая, може да се наложи да се направят промени в определена клетка и можете да направите това по клетъчен индекс, както добре.
Следният пример с код показва как да се извлече индексът на клетка в ред:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
int cellIndex = row.IndexOf(row.Cells[4]); |
Работа с колони
В Aspose.Words Document Object Model (DOM), Table Възелът се състои от Row Възли и после Cell Възли. По този начин в Document
Модел на обекта Aspose.Words, както в Word документи, няма понятие за колона.
По дизайн, редовете в таблицата Microsoft Word както и Aspose.Words са напълно независими и основните свойства и операции се съдържат само в редовете и клетките на таблицата. Това дава на таблиците способността да имат някои интересни атрибути:
- Всеки ред на масата може да има напълно различен брой клетки
- Вертикално, клетките на всеки ред могат да имат различни ширини
- Възможно е да се присъединят таблици с различен ред формати и брой клетки
Всички операции, извършвани върху колони са всъщност “къси пътища,” които извършват операцията чрез колективно смяна на редовите клетки по такъв начин, че изглежда, че се прилагат към колони. Това означава, че можете да извършвате операции на колоните, като просто итерирате върху същия индекс на редовете.
Следният пример за код опростява такива операции чрез доказване на фасаден клас, който събира клетките, които съставляват “колони” на таблица:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
/// <summary> | |
/// Represents a facade object for a column of a table in a Microsoft Word document. | |
/// </summary> | |
internal class Column | |
{ | |
private Column(Table table, int columnIndex) | |
{ | |
mTable = table ?? throw new ArgumentException("table"); | |
mColumnIndex = columnIndex; | |
} | |
/// <summary> | |
/// Returns a new column facade from the table and supplied zero-based index. | |
/// </summary> | |
public static Column FromIndex(Table table, int columnIndex) | |
{ | |
return new Column(table, columnIndex); | |
} | |
/// <summary> | |
/// Returns the cells which make up the column. | |
/// </summary> | |
public Cell[] Cells => GetColumnCells().ToArray(); | |
/// <summary> | |
/// Returns the index of the given cell in the column. | |
/// </summary> | |
public int IndexOf(Cell cell) | |
{ | |
return GetColumnCells().IndexOf(cell); | |
} | |
/// <summary> | |
/// Inserts a brand new column before this column into the table. | |
/// </summary> | |
public Column InsertColumnBefore() | |
{ | |
Cell[] columnCells = Cells; | |
if (columnCells.Length == 0) | |
throw new ArgumentException("Column must not be empty"); | |
// Create a clone of this column. | |
foreach (Cell cell in columnCells) | |
cell.ParentRow.InsertBefore(cell.Clone(false), cell); | |
// This is the new column. | |
Column column = new Column(columnCells[0].ParentRow.ParentTable, mColumnIndex); | |
// We want to make sure that the cells are all valid to work with (have at least one paragraph). | |
foreach (Cell cell in column.Cells) | |
cell.EnsureMinimum(); | |
// Increase the index which this column represents since there is now one extra column in front. | |
mColumnIndex++; | |
return column; | |
} | |
/// <summary> | |
/// Removes the column from the table. | |
/// </summary> | |
public void Remove() | |
{ | |
foreach (Cell cell in Cells) | |
cell.Remove(); | |
} | |
/// <summary> | |
/// Returns the text of the column. | |
/// </summary> | |
public string ToTxt() | |
{ | |
StringBuilder builder = new StringBuilder(); | |
foreach (Cell cell in Cells) | |
builder.Append(cell.ToString(SaveFormat.Text)); | |
return builder.ToString(); | |
} | |
/// <summary> | |
/// Provides an up-to-date collection of cells which make up the column represented by this facade. | |
/// </summary> | |
private List<Cell> GetColumnCells() | |
{ | |
List<Cell> columnCells = new List<Cell>(); | |
foreach (Row row in mTable.Rows) | |
{ | |
Cell cell = row.Cells[mColumnIndex]; | |
if (cell != null) | |
columnCells.Add(cell); | |
} | |
return columnCells; | |
} | |
private int mColumnIndex; | |
private readonly Table mTable; | |
} |
Следният пример с код показва как да се постави празна колона в таблица:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Tables.docx"); | |
Table table = (Table) doc.GetChild(NodeType.Table, 0, true); | |
Column column = Column.FromIndex(table, 0); | |
// Print the plain text of the column to the screen. | |
Console.WriteLine(column.ToTxt()); | |
// Create a new column to the left of this column. | |
// This is the same as using the "Insert Column Before" command in Microsoft Word. | |
Column newColumn = column.InsertColumnBefore(); | |
foreach (Cell cell in newColumn.Cells) | |
cell.FirstParagraph.AppendChild(new Run(doc, "Column Text " + newColumn.IndexOf(cell))); |
Следният пример за код показва как да се премахне колона от таблица в документ:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Tables.docx"); | |
Table table = (Table) doc.GetChild(NodeType.Table, 1, true); | |
Column column = Column.FromIndex(table, 2); | |
column.Remove(); |
Задаване на редове като заглавни редове
Можете да изберете да повторите първия ред в таблицата като Header Row само на първата страница или на всяка страница, ако таблицата е разделена на няколко. В Aspose.Words, Можете да повторите заглавието на всяка страница с помощта на HeadingFormat собственост.
Можете също така да маркирате няколко заглавни редове, ако тези редове са разположени един след друг в началото на таблицата. За да направите това, трябва да приложите HeadingFormat свойства на тези редове.
Следният пример за код показва как да се изгради таблица, която включва Заглавни редове, които се повтарят на следващите страници:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.StartTable(); | |
builder.RowFormat.HeadingFormat = true; | |
builder.ParagraphFormat.Alignment = ParagraphAlignment.Center; | |
builder.CellFormat.Width = 100; | |
builder.InsertCell(); | |
builder.Writeln("Heading row 1"); | |
builder.EndRow(); | |
builder.InsertCell(); | |
builder.Writeln("Heading row 2"); | |
builder.EndRow(); | |
builder.CellFormat.Width = 50; | |
builder.ParagraphFormat.ClearFormatting(); | |
for (int i = 0; i < 50; i++) | |
{ | |
builder.InsertCell(); | |
builder.RowFormat.HeadingFormat = false; | |
builder.Write("Column 1 Text"); | |
builder.InsertCell(); | |
builder.Write("Column 2 Text"); | |
builder.EndRow(); | |
} | |
doc.Save(ArtifactsDir + "WorkingWithTables.RepeatRowsOnSubsequentPages.docx"); |
Запазване на таблици и редове от прекъсване на страниците
Има моменти, когато съдържанието на таблицата не трябва да се разделя на страници. Например, ако заглавието е над една маса, заглавието и таблицата трябва винаги да се държат заедно на една и съща страница, за да се запази правилното външен вид.
Има две отделни техники, които са полезни за постигане на тази функционалност:
Allow row break across pages
, за редове в таблицатаKeep with next
, които се прилагат към параграфи в таблици
По подразбиране горните свойства са изключени.
Запазване на ред от прекъсване на страниците
Това включва ограничаване на съдържанието в клетките на един ред от разделяне на една страница. В Microsoft Word, това може да се намери под Table Properties като опцията готварски ред да се прекъсне през страниците. В Aspose.Words това е открито под RowFormat обект на a Row като свойство RowFormat.AllowBreakAcrossPages.
Следният пример за код показва как да се деактивират редовете на страниците за всеки ред в таблица:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Table spanning two pages.docx"); | |
Table table = (Table) doc.GetChild(NodeType.Table, 0, true); | |
// Disable breaking across pages for all rows in the table. | |
foreach (Row row in table.Rows) | |
row.RowFormat.AllowBreakAcrossPages = false; | |
doc.Save(ArtifactsDir + "WorkingWithTables.RowFormatDisableBreakAcrossPages.docx"); |
Запазване на таблица от прекъсване на страниците
За да спрем разделянето на таблицата между страниците, трябва да уточним, че искаме съдържанието в таблицата да остане заедно.
За да направите това, Aspose.Words използва метод, който позволява на потребителите да избират таблица и позволява KeepWithNext параметър към true за всеки параграф в рамките на таблиците. Изключението е последният параграф от таблицата, който следва да бъде определен false.
Следният пример за код показва как да се постави таблица, за да останем заедно на една и съща страница:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Table spanning two pages.docx"); | |
Table table = (Table) doc.GetChild(NodeType.Table, 0, true); | |
// 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. | |
foreach (Cell cell in table.GetChildNodes(NodeType.Cell, true)) | |
{ | |
cell.EnsureMinimum(); | |
foreach (Paragraph para in cell.Paragraphs) | |
if (!(cell.ParentRow.IsLastRow && para.IsEndOfCell)) | |
para.ParagraphFormat.KeepWithNext = true; | |
} | |
doc.Save(ArtifactsDir + "WorkingWithTables.KeepTableTogether.docx"); |