Робота з колонами та рядками

Для більшого контролю над тим, як працюють таблиці, вивчіть, як маніпулювати стовпчики і рядки.

Знайти Індекс елемента таблиці

Колонки, рядки та клітини керовані шляхом доступу до вибраного вузла документа індексом. Пошук індексу будь-якого вузла передбачає збирання всіх дочірніх вузлів елемента з материнської вершини, а потім використання 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;
}
view raw column-class.cs hosted with ❤ by GitHub

Приклад наступного коду показує, як вставити порожній стовпчик в таблицю:

// 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();

Вказати рядки як головка

Ви можете вибрати для повторення першого ряду в таблиці як заголовок, тільки на першій сторінці або на кожній сторінці, якщо таблиця розщеплюється на кілька. У 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");

Тримайте таблиці та рядки від Breaking Across Сторінки

Часом, де вміст таблиці не повинно бути розщеплення по сторінках. Наприклад, якщо заголовок вище таблиці, заголовок та таблиці завжди слід тримати разом на одній сторінці, щоб зберегти правильний вигляд.

Є дві окремі техніки, які корисні для досягнення цієї функціональності:

  • до Allow row break across pages, який наноситься на рядки таблиці
  • до Keep with next, який наноситься на абзаци в клітинах таблиці

За замовчуванням вищевказані властивості вимкнено.

Зберігати Row від Breaking Across Сторінки

Це передбачає обмеження вмісту всередині клітин рядка від розщеплення по всій сторінці. У Microsoft Word, Це може бути знайдений під Table Properties як варіант “Дозволений рядок для розбиття сторінок”. У Aspose.Words це знайдено під RowFormat об’єкт об’єкта 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");

Тримайте таблицю з розірвання сторінок Across

Щоб зупинити таблицю з розщеплення по сторінках, потрібно вказати, що ми хочемо, щоб вміст, що міститься в таблиці, щоб триматися разом.

Для цього 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");