Freigeben über


Einfügen einer Tabelle in ein Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um eine Tabelle programmgesteuert in ein Textverarbeitungsdokument einzufügen.

Abrufen eines WordprocessingDocument-Objekts

Instanziieren Sie zum Öffnen eines vorhandenen Dokuments die WordprocessingDocument-Klasse wie in der folgenden using-Anweisung gezeigt. In derselben Anweisung wird die Textverarbeitungsdatei an dem angegebenen Dateipfad geöffnet, indem die Open-Methode verwendet wird, wobei der boolesche Parameter auf true festgelegt ist, um die Bearbeitung des Dokuments zu ermöglichen.

    using (WordprocessingDocument doc =
           WordprocessingDocument.Open(filepath, true)) 
    { 
       // Insert other code here. 
    }

Die using-Anweisung stellt eine empfohlene Alternative zu der üblichen Sequenz „.Create, .Save, .Close“ dar. Mit dieser wird sichergestellt, dass die Dispose-Methode (interne vom Open XML SDK zum Bereinigen von Ressourcen verwendete Methode) automatisch aufgerufen wird, wenn die schließende Klammer erreicht ist. Der Block, der auf die using-Anweisung folgt, erstellt einen Bereich für das Objekt, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall „doc“. Da die WordprocessingDocument-Klasse des Open XML SDK automatisch das Objekt als Teil der System.IDisposable-Implementierung speichert und schließt, und da Dispose automatisch beim Beenden des Blocks aufruft, müssen Sie nicht explizit Speichern und Schließen aufrufen, solange Sie using verwenden.

Struktur einer Tabelle

Die grundlegende Struktur eines WordProcessingML-Dokuments besteht aus den document- und body-Elementen, gefolgt von einem oder mehreren Block-Level-Elementen wie p, das für einen Absatz steht. Ein Absatz enthält ein oder mehrere r-Elemente. r steht für ausführen und meint einen Textbereich mit gemeinsamen Eigenschaften wie Formatierung. Eine Ausführung besteht aus einem oder mehreren t-Elementen. Das t-Element enthält einen Textbereich. Das Dokument kann eine Tabelle wie in diesem Beispiel enthalten. Eine Tabelle besteht aus einer Reihe von Absätzen (und anderen Inhalten auf Blockebene), die in Zeilen und Spalten angeordnet sind. Tabellen in WordprocessingML werden über das tbl-Element definiert, das dem HTML-Tabellentag entspricht. Stellen Sie sich eine leere Tabelle mit einer Zelle (d. h. eine Tabelle mit einer Zeile, einer Spalte) und 1 Punktrahmen auf allen Seiten vor. Diese Tabelle wird durch das folgende WordprocessingML-Markupsegment dargestellt.

    <w:tbl>
      <w:tblPr>
        <w:tblW w:w="5000" w:type="pct"/>
        <w:tblBorders>
          <w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:left w:val="single" w:sz="4 w:space="0" w:color="auto"/>
          <w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
        </w:tblBorders>
      </w:tblPr>
      <w:tblGrid>
        <w:gridCol w:w="10296"/>
      </w:tblGrid>
      <w:tr>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="0" w:type="auto"/>
          </w:tcPr>
          <w:p/>
        </w:tc>
      </w:tr>
    </w:tbl>

Für diese Tabelle sind Eigenschaften für die Tabellenbreite von 100 % der Seitenbreite festgelegt, indem das tblW-Element verwendet wird, eine Gruppe von Tabellenrahmen mithilfe des tblBorders-Elements, das Tabellenraster, das eine Gruppe von gemeinsamen vertikalen Kanten innerhalb der Tabelle mithilfe des tblGrid-Elements definiert, und eine einzelne Tabellenzeile mithilfe des tr-Elements.

Funktionsweise des Beispielcodes

Im Beispielcode wird nach dem Öffnen des Dokuments in der using-Anweisung ein neues Table-Objekt erstellt. Dann erstellen Sie ein TableProperties-Objekt und geben seine Rahmeninformationen an. Die TableProperties-Klasse enthält einen überladenen Konstruktor TableProperties(), der ein params-Array vom Typ OpenXmlElement verwendet. Der Code verwendet diesen Konstruktor zum Instanziieren eines TableProperties-Objekts mit BorderType-Objekten für jeden Rahmen, wodurch jeder BorderType instanziiert und dessen Wert mithilfe von Objektinitialisierern angegeben wird. Fügen Sie das TableProperties-Objekt nach der Instanziierung an die Tabelle an.

    // Create an empty table.
    Table table = new Table();

    // Create a TableProperties object and specify its border information.
    TableProperties tblProp = new TableProperties(
        new TableBorders(
            new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Dashed), Size = 24 },
            new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Dashed), Size = 24 },
            new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Dashed), Size = 24 },
            new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Dashed), Size = 24 },
            new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Dashed), Size = 24 },
            new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Dashed), Size = 24 }
        )
    ); 
    // Append the TableProperties object to the empty table.
    table.AppendChild<TableProperties>(tblProp);

Vom Code wird eine Tabellenzeile erstellt. In diesem Abschnitt des Codes werden die überladenen Append[]) -Methoden umfassend verwendet, die von OpenXmlElement abgeleitete Klassen erben. Die Append-Methoden bieten die Möglichkeit des Anfügens eines einzelnen Elements oder eines Abschnitts einer XML-Struktur an das Ende der Liste untergeordneter Element unter einem bestimmten übergeordneten Element. Als Nächstes erstellt der Code ein TableCell-Objekt, das eine einzelne Tabellenzelle darstellt, und gibt die Breite der Tabellenzelle mithilfe eines TableCellProperties-Objekts und den Zelleninhalt („"Hello, World!“) unter Verwendung eines Text-Objekts an. Im Open XML-Wordprocessing-Schema enthält ein paragraph-Element (<p>) run-Elemente (<r>), die wiederum text-Elemente (<t>) enthalten. Zum Einfügen von Text in eine Tabellenzelle mithilfe der API müssen Sie ein Paragraph-Objekt erstellen, das ein Run-Objekt enthält, das ein Text-Objekt mit dem Text enthält, den Sie in die Zelle einfügen möchten. Sie fügen dann das Paragraph-Objekt an das TableCell-Objekt an. Dadurch wird die entsprechende XML-Struktur zum Einfügen von Text in eine Zelle erstellt. Die TableCell wird dann an das TableRow Objekt angefügt.

    // Create a row.
    TableRow tr = new TableRow();

    // Create a cell.
    TableCell tc1 = new TableCell();

    // Specify the width property of the table cell.
    tc1.Append(new TableCellProperties(new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2400" }));

    // Specify the table cell content.
    tc1.Append(new Paragraph(new Run(new Text("Hello, World!"))));

    // Append the table cell to the table row.
    tr.Append(tc1);

Der Code erstellt dann eine zweite Tabellenzelle. Im letzten Codeabschnitt wird eine weitere Tabellenzelle mithilfe des überladenen TableCell-Konstruktors TableCell(String) erstellt, der die OuterXml-Eigenschaft eines vorhandenen TableCell-Objekts als einziges Argument verwendet. Nach dem Erstellen der zweiten Tabellenzelle, fügt der Code die TableCell an die TableRow, die TableRow an die Table und die Table an das Document-Objekt an.

    // Create a second table cell by copying the OuterXml value of the first table cell.
    TableCell tc2 = new TableCell(tc1.OuterXml);

    // Append the table cell to the table row.
    tr.Append(tc2);

    // Append the table row to the table.
    table.Append(tr);

    // Append the table to the document.
    doc.MainDocumentPart.Document.Body.Append(table);

    // Save changes to the MainDocumentPart.
    doc.MainDocumentPart.Document.Save();

Beispielcode

Das folgende Codebeispiel veranschaulicht Folgendes: das Erstellen einer Tabelle, das Festlegen ihrer Eigenschaften, das Einfügen von Text in eine Zelle in der Tabelle, das Kopieren einer Zelle und schließlich das Einfügen der Tabelle in ein Textverarbeitungsdokument. Sie können die CreateTable-Methode mithilfe des folgenden Aufrufs aufrufen.

    string fileName = @"C:\Users\Public\Documents\Word10.docx";
    CreateTable(fileName);

After you run the program inspect the file "Word10.docx" to see the inserted table.

Es folgt der vollständige Beispielcode in C# und Visual Basic.

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;

CreateTable(args[0]);

// Insert a table into a word processing document.
static void CreateTable(string fileName)
{
    // Use the file name and path passed in as an argument 
    // to open an existing Word 2007 document.

    using (WordprocessingDocument doc
        = WordprocessingDocument.Open(fileName, true))
    {
        // Create an empty table.
        Table table = new Table();

        // Create a TableProperties object and specify its border information.
        TableProperties tblProp = new TableProperties(
            new TableBorders(
                new TopBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new BottomBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new LeftBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new RightBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new InsideHorizontalBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                },
                new InsideVerticalBorder()
                {
                    Val =
                    new EnumValue<BorderValues>(BorderValues.Dashed),
                    Size = 24
                }
            )
        );

        // Append the TableProperties object to the empty table.
        table.AppendChild<TableProperties>(tblProp);

        // Create a row.
        TableRow tr = new TableRow();

        // Create a cell.
        TableCell tc1 = new TableCell();

        // Specify the width property of the table cell.
        tc1.Append(new TableCellProperties(
            new TableCellWidth() { Type = TableWidthUnitValues.Dxa, Width = "2400" }));

        // Specify the table cell content.
        tc1.Append(new Paragraph(new Run(new Text("some text"))));

        // Append the table cell to the table row.
        tr.Append(tc1);

        // Create a second table cell by copying the OuterXml value of the first table cell.
        TableCell tc2 = new TableCell(tc1.OuterXml);

        // Append the table cell to the table row.
        tr.Append(tc2);

        // Append the table row to the table.
        table.Append(tr);

        if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        // Append the table to the document.
        doc.MainDocumentPart.Document.Body.Append(table);
    }
}