Utwórz tabelę

Aspose.Words pozwala użytkownikom na tworzenie tabel w dokumencie od podstaw i zapewnia kilka różnych metod w tym celu. Ten artykuł przedstawia szczegóły dotyczące dodawania sformatowanych tabel do dokumentu przy użyciu każdej metody, jak również porównanie każdej metody na końcu artykułu.

Domyślne style tabeli

Nowo utworzona tabela otrzymuje wartości domyślne podobne do tych stosowanych w Microsoft Word:

Właściwość tabeli Domyślnie Aspose.Words
Border Style Single
Border Width 1/2 pt
Kolor granic Black
Left and Right Padding 5.4 pts
AutoFit Mode AutoFit to Window
Allow AutoFit True

Tworzenie tabeli z DocumentBuilder

W Aspose.Words, użytkownicy mogą utworzyć tabelę w dokumencie za pomocą DocumentBuilder. Podstawowy algorytm tworzenia tabeli jest następujący:

  1. Rozpocznij tabelę od StartTable
  2. Dodaj komórkę do tabeli używając InsertCell - automatycznie uruchamia nowy wiersz
  3. Opcjonalnie należy użyć CellFormat właściwość do określenia formatowania komórek
  4. Wstaw zawartość komórki używając odpowiedniej DocumentBuilder metody takie jak Writeln, InsertImage, i inne
  5. Powtarzać kroki 2- 4 aż do zakończenia wiersza
  6. Call EndRow aby zakończyć bieżący wiersz
  7. Opcjonalnie należy użyć RowFormat właściwość do określenia formatowania wierszy
  8. Powtarzać kroki 2- 7 aż do zakończenia tabeli
  9. Call EndTable aby zakończyć budowanie stołu

Proces tworzenia tabeli można wyraźnie zobaczyć na poniższym rysunku:

creating-table-process

Poniższy przykład kodu pokazuje jak utworzyć prostą tabelę używając DocumentBuilder z domyślnym formatowaniem:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Start building the table.
builder.startTable();
builder.insertCell();
builder.write("Row 1, Cell 1 Content.");
// Build the second cell.
builder.insertCell();
builder.write("Row 1, Cell 2 Content.");
// Call the following method to end the row and start a new row.
builder.endRow();
// Build the first cell of the second row.
builder.insertCell();
builder.write("Row 2, Cell 1 Content");
// Build the second cell.
builder.insertCell();
builder.write("Row 2, Cell 2 Content.");
builder.endRow();
// Signal that we have finished building the table.
builder.endTable();
doc.save(getArtifactsDir() + "WorkingWithTables.CreateSimpleTable.docx");

Poniższy przykład kodu pokazuje jak utworzyć sformatowaną tabelę używając DocumentBuilder:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Table table = builder.startTable();
builder.insertCell();
// Table wide formatting must be applied after at least one row is present in the table.
table.setLeftIndent(20.0);
// Set height and define the height rule for the header row.
builder.getRowFormat().setHeight(40.0);
builder.getRowFormat().setHeightRule(HeightRule.AT_LEAST);
builder.getCellFormat().getShading().setBackgroundPatternColor(new Color((198), (217), (241)));
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
builder.getFont().setSize(16.0);
builder.getFont().setName("Arial");
builder.getFont().setBold(true);
builder.getCellFormat().setWidth(100.0);
builder.write("Header Row,\n Cell 1");
// We don't need to specify this cell's width because it's inherited from the previous cell.
builder.insertCell();
builder.write("Header Row,\n Cell 2");
builder.insertCell();
builder.getCellFormat().setWidth(200.0);
builder.write("Header Row,\n Cell 3");
builder.endRow();
builder.getCellFormat().getShading().setBackgroundPatternColor(Color.WHITE);
builder.getCellFormat().setWidth(100.0);
builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
// Reset height and define a different height rule for table body.
builder.getRowFormat().setHeight(30.0);
builder.getRowFormat().setHeightRule(HeightRule.AUTO);
builder.insertCell();
// Reset font formatting.
builder.getFont().setSize(12.0);
builder.getFont().setBold(false);
builder.write("Row 1, Cell 1 Content");
builder.insertCell();
builder.write("Row 1, Cell 2 Content");
builder.insertCell();
builder.getCellFormat().setWidth(200.0);
builder.write("Row 1, Cell 3 Content");
builder.endRow();
builder.insertCell();
builder.getCellFormat().setWidth(100.0);
builder.write("Row 2, Cell 1 Content");
builder.insertCell();
builder.write("Row 2, Cell 2 Content");
builder.insertCell();
builder.getCellFormat().setWidth(200.0);
builder.write("Row 2, Cell 3 Content.");
builder.endRow();
builder.endTable();
doc.save(getArtifactsDir() + "WorkingWithTables.FormattedTable.docx");

Poniższy przykład kodu pokazuje jak wstawić zagnieżdżoną tabelę używając DocumentBuilder:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Cell cell = builder.insertCell();
builder.writeln("Outer Table Cell 1");
builder.insertCell();
builder.writeln("Outer Table Cell 2");
// This call is important to create a nested table within the first table.
// Without this call, the cells inserted below will be appended to the outer table.
builder.endTable();
// Move to the first cell of the outer table.
builder.moveTo(cell.getFirstParagraph());
// Build the inner table.
builder.insertCell();
builder.writeln("Inner Table Cell 1");
builder.insertCell();
builder.writeln("Inner Table Cell 2");
builder.endTable();
doc.save(getArtifactsDir() + "WorkingWithTables.NestedTable.docx");

Utwórz tabelę poprzez DOM (Document Object Model)

Można umieścić tabele bezpośrednio w DOM dodając nowy Table węzeł w określonym położeniu.

Należy pamiętać, że zaraz po utworzeniu węzła tabeli, sama tabela będzie całkowicie pusta, czyli nie zawiera jeszcze wierszy i komórek. Aby umieścić wiersze i komórki w tabeli, dodać odpowiedni Row oraz Cell węzły dziecięce do DOM.

Poniższy przykład kodu pokazuje, jak zbudować nową tabelę od podstaw poprzez dodanie odpowiednich węzłów dziecięcych do drzewa dokumentów:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
// We start by creating the table object. Note that we must pass the document object
// to the constructor of each node. This is because every node we create must belong
// to some document.
Table table = new Table(doc);
doc.getFirstSection().getBody().appendChild(table);
// Here we could call EnsureMinimum to create the rows and cells for us. This method is used
// to ensure that the specified node is valid. In this case, a valid table should have at least one Row and one cell.
// Instead, we will handle creating the row and table ourselves.
// This would be the best way to do this if we were creating a table inside an algorithm.
Row row = new Row(doc);
row.getRowFormat().setAllowBreakAcrossPages(true);
table.appendChild(row);
// We can now apply any auto fit settings.
table.autoFit(AutoFitBehavior.FIXED_COLUMN_WIDTHS);
Cell cell = new Cell(doc);
cell.getCellFormat().getShading().setBackgroundPatternColor(Color.BLUE);
cell.getCellFormat().setWidth(80.0);
cell.appendChild(new Paragraph(doc));
cell.getFirstParagraph().appendChild(new Run(doc, "Row 1, Cell 1 Text"));
row.appendChild(cell);
// We would then repeat the process for the other cells and rows in the table.
// We can also speed things up by cloning existing cells and rows.
row.appendChild(cell.deepClone(false));
row.getLastCell().appendChild(new Paragraph(doc));
row.getLastCell().getFirstParagraph().appendChild(new Run(doc, "Row 1, Cell 2 Text"));
doc.save(getArtifactsDir() + "WorkingWithTables.InsertTableDirectly.docx");

Utwórz tabelę z HTML

Aspose.Words obsługuje wprowadzanie treści do dokumentu ze źródła HTML za pomocą InsertHtml Metoda. Wejście może być pełną stroną HTML lub tylko częściowym fragmentem.

Używając tego InsertHtml metoda, użytkownicy mogą umieścić tabele w dokumencie za pomocą tagów tabeli jak <table>, <tr>, <td>.

Poniższy przykład kodu pokazuje jak włożyć tabelę do dokumentu z łańcucha zawierającego znaczniki HTML:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Note that AutoFitSettings does not apply to tables inserted from HTML.
builder.insertHtml("<table>" +
"<tr>" +
"<td>Row 1, Cell 1</td>" +
"<td>Row 1, Cell 2</td>" +
"</tr>" +
"<tr>" +
"<td>Row 2, Cell 2</td>" +
"<td>Row 2, Cell 2</td>" +
"</tr>" +
"</table>");
doc.save(getArtifactsDir() + "WorkingWithTables.InsertTableFromHtml.docx");

Wstaw kopię istniejącej tabeli

Często trzeba stworzyć tabelę opartą na istniejącej tabeli w dokumencie. Najprostszym sposobem powielenia tabeli przy zachowaniu wszystkich formatowania jest sklonowanie węzła tabeli za pomocą deepClone Metoda.

Tę samą technikę można zastosować do dodania kopii istniejącego wiersza lub komórki do tabeli.

Poniższy przykład kodu pokazuje jak skopiować tabelę przy użyciu konstruktorów węzłów:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Tables.docx");
Table table = (Table) doc.getChild(NodeType.TABLE, 0, true);
// Clone the table and insert it into the document after the original.
Table tableClone = (Table) table.deepClone(true);
table.getParentNode().insertAfter(tableClone, table);
// Insert an empty paragraph between the two tables,
// or else they will be combined into one upon saving this has to do with document validation.
table.getParentNode().insertAfter(new Paragraph(doc), table);
doc.save(getArtifactsDir() + "WorkingWithTables.CloneCompleteTable.docx");

Poniższy przykład kodu pokazuje jak sklonować ostatni wiersz tabeli i dołączyć go do tabeli:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git.
Document doc = new Document(getMyDir() + "Tables.docx");
Table table = (Table) doc.getChild(NodeType.TABLE, 0, true);
Row clonedRow = (Row) table.getLastRow().deepClone(true);
// Remove all content from the cloned row's cells. This makes the row ready for new content to be inserted into.
for (Cell cell : (Iterable<Cell>) clonedRow.getCells())
cell.removeAllChildren();
table.appendChild(clonedRow);
doc.save(getArtifactsDir() + "WorkingWithTables.CloneLastRow.docx");

Jeśli patrzysz na tworzenie tabel w dokumencie, który dynamicznie rośnie z każdym rekordem ze źródła danych, to powyższa metoda nie jest zalecana. Zamiast tego, pożądane wyjście jest łatwiej osiągnąć za pomocą Mail merge z regionami. Można dowiedzieć się więcej o tej technice w Mail Merge z regionami sekcja.

Porównaj sposoby tworzenia tabeli

Aspose.Words zawiera kilka metod tworzenia nowych tabel w dokumencie. Każda metoda ma swoje zalety i wady, więc wybór, którego używać często zależy od konkretnej sytuacji.

Przyjrzyjmy się bliżej tym sposobom tworzenia tabel i porównujmy ich zalety i wady:

Metoda Korzyści Uszkodzenia
Via DocumentBuilder Standardowa metoda wprowadzania tabel i innych treści dokumentów Czasami trudno jest stworzyć wiele odmian tabel w tym samym czasie z tej samej instancji konstruktora
Via DOM Pasuje lepiej z otaczającym kodem, który tworzy i wprowadza węzły bezpośrednio do DOM bez użycia DocumentBuilder Tabela jest tworzona “pusty”: przed wykonaniem większości operacji, należy zadzwonić EnsureMinimum do tworzenia brakujących węzłów dziecięcych
Z HTML Można utworzyć nową tabelę ze źródła HTML przy użyciu tagów takich jak <table>, <tr>, <td> Nie wszystkie możliwe Microsoft Word formaty tabel mogą być stosowane do HTML
Klonowanie istniejącej tabeli Możesz utworzyć kopię istniejącej tabeli zachowując wszystkie wiersze i formatowanie komórek Przed przygotowaniem tabeli do użycia należy usunąć odpowiednie węzły dziecięce