Lucrul cu coloane și rânduri

Pentru mai mult control asupra modului în care funcţionează tabelele, învăţaţi cum să manipulaţi coloanele şi rândurile.

Găseşte Indicele Elementului Tabel

Coloanele, rândurile și celulele sunt gestionate prin accesarea nodului de document selectat după indicele său. Găsirea indicelui unui nod implică colectarea tuturor nodurilor copil ale tipului de element din nodul părinte, și apoi folosirea metodei IndexOf pentru a găsi indicele nodului dorit în colecție.

Găsiți Indicele unei Tabeli într-un Document

Uneori, s-ar putea să aveți nevoie de a face schimbări la o masă specifică într-un document. Pentru a face acest lucru poți să te referi la o tabelă prin indicele său.

Exemplul de cod următor prezintă modul în care se poate obține indicele unei tabele dintr-un document:

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

Găsește Indicele unei Rânduri într-o Tabelă

Similar, s-ar putea să fie necesar să faci modificări la un rând specific într-o tabelă selectată. Pentru aceasta, puteți face referire și la o rând prin indexul acestuia.

Exemplul următor de cod arată cum se obține indicele unei rânduri într-o masă:

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

Găsiți Indicele unei Celule într-o Rând

În final, s-ar putea să aveți nevoie să faceți modificări la o anumită celulă și puteți face acest lucru prin celula ca bine.

Exemplul de cod următor arată cum se obține indicele unei celule într-un rând:

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

Lucrează cu coloane

În Aspose.Words Document Object Model (DOM), nodul Table constă din Row noduri și apoi Cell noduri. Astfel, în modelul obiectelor Document din Aspose.Words, așa cum este cazul și în documentele Word, nu există ideea de coloană.

Prin design, rândurile din Microsoft Word și Aspose.Words sunt complet independente; iar proprietățile de bază și operațiunile sunt conținute doar în rândurile și celulele tabelului. Acest lucru îi dă tabelelor capacitatea de a avea câteva atribute interesante:

  • Fiecare rând de tabel poate avea un număr complet diferit de celule
  • Celulele fiecărei rânduri pot avea lățimi diferite
  • Este posibil să se unească tabele cu formate de rând diferite și număr de celule

Orice operații efectuate pe coloane sunt, de fapt, “scurtături” care efectuează operația prin schimbarea colectivă a celulelor rândului în așa fel încât să pară că se aplică la coloane. Adică, puteți efectua operații pe coloane prin simpla iterare peste același index de celulă a rândului din tabel.

Exemplul de cod următor simplifică astfel de operațiuni prin furnizarea unei clase “facade” care colectează celulele care alcătuiesc o coloană dintr-o tabelă:

// 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

Exemplul de cod următor arată cum să inserezi o coloană goală într-o tabelă:

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

Exemplul de cod următor arată cum să elimini o coloană dintr-o masă într-un document:

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

Specificați rândurile ca rânduri de antet

Puteți alege să repetați primul rând din tabel ca și rând de antet numai pe prima pagină sau pe fiecare pagină dacă tabelul este împărțit în mai multe. În Aspose.Words, poţi repeta linia de antet pe fiecare pagină folosind proprietatea HeadingFormat.

Puteți marca, de asemenea, mai multe rânduri de antet dacă aceste rânduri sunt situate unul după altul la începutul tabelului. Pentru a face asta trebuie să aplici proprietățile HeadingFormat acestor rânduri.

Exemplul de cod de mai jos arată cum să construiești o tabelă care include rânduri de antet care se repetă pe paginile ulterioare:

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

Păstrați tabele și rânduri de la a se rupe pe pagină

Sunt momente în care conținutul unei tabele nu ar trebui să fie împărțit pe pagini. De exemplu, dacă un titlu se află deasupra unei tabele, titlul și tabelul ar trebui să fie întotdeauna păstrate împreună pe aceeași pagină pentru a păstra o aspectare corespunzătoare.

Există două tehnici separate care sunt utile pentru a realiza această funcționalitate:

  • Allow row break across pages, care este aplicat rândurilor de masă
  • Keep with next, care este aplicat paragrafelor în celule de tabelă

În mod implicit, proprietățile de mai sus sunt dezactivate.

Păstrați rânduri de la a se rupe pe pagini

Acest lucru presupune restricționarea conținutului din celulele unei rânduri de la a fi împărțit pe pagină. În Microsoft Word, aceasta poate fi găsită sub proprietățile Tabelului ca opțiunea “Permite rândului să se spargă pe pagini. În Aspose.Words aceasta este găsită sub obiectul RowFormat al unui Row, ca proprietatea RowFormat.AllowBreakAcrossPages.

Exemplul de cod următor arată cum să dezactivați ruperea rândurilor peste pagini pentru fiecare rând dintr-o tabelă:

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

Păstrează un tabel de la a se rupe pe pagini

Ca să împiedicăm ca o masă să se împartă peste pagini, avem nevoie să specificăm că vreau conținutul cuprins în masă să rămână împreună.

Pentru acest lucru, Aspose.Words folosește o metodă, care permite utilizatorilor să selecteze un tabel și să activeze parametrul KeepWithNext la true pentru fiecare paragraf din celulele tabelului. “Excepția este ultimul paragraf din tabel, care ar trebui să fie setat la false.”

Exemplul de cod următor arată cum se setează o masă care să rămână împreună pe aceeași pagină:

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