Freigeben über


Ändern von Text in einer Tabelle in einem Textverarbeitungsdokument

In diesem Thema wird gezeigt, wie Sie das Open XML SDK für Office verwenden, um Text in einer Tabelle in einem vorhandenen Textverarbeitungsdokument programmgesteuert zu ändern.

Öffnen des vorhandenen Dokuments

Instanziieren Sie zum Öffnen eines vorhandenen Dokuments die WordprocessingDocument-Klasse wie in der folgenden using-Anweisung gezeigt. Öffnen Sie in derselben Anweisung die Textverarbeitungsdatei im angegebenen Dateipfad , indem Sie die Open-Methode verwenden, 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 ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". 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. Es empfiehlt sich, eine Tabelle mit einer Zelle (d. h. eine Tabelle mit einer Zeile und einer Spalte) und 1-Punkt-Rahmen auf allen Seiten zu verwenden. Die Tabelle wird durch das folgende WordprocessingML-Codebeispiel 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 die erste Tabelle im Dokument gesucht. Suchen Sie dann die zweite Zeile in der Tabelle, indem Sie die Zeile mit dem Index 1 suchen. Anschließend wird die dritte Zelle in dieser Zeile, deren Index 2 ist gesucht, wie im folgenden Codebeispiel gezeigt wird.

    // Find the first table in the document.
    Table table =
        doc.MainDocumentPart.Document.Body.Elements<Table>().First();

    // Find the second row in the table.
    TableRow row = table.Elements<TableRow>().ElementAt(1);

    // Find the third cell in the row.
    TableCell cell = row.Elements<TableCell>().ElementAt(2);

Nachdem Sie die Zielzelle bestimmt haben, suchen Sie den ersten Lauf im ersten Absatz der Zelle und ersetzen den Text durch den übergebenen Text. Im folgenden Codebeispiel werden diese Aktionen veranschaulicht.

    Paragraph p = cell.Elements<Paragraph>().First();
    Run r = p.Elements<Run>().First();
    Text t = r.Elements<Text>().First();
    t.Text = txt;

Ändern von Text in einer Zelle in einer Tabelle

Das folgende Codebeispiel zeigt, wie Sie den Text in der angegebenen Tabellenzelle in einem Textverarbeitungsdokument ändern. Im Codebeispiel wird erwartet, dass das Dokument, dessen Dateiname und Pfad als Argument an die ChangeTextInCell-Methode übergeben werden, eine Tabelle enthält. Im Codebeispiel wird außerdem erwartet, dass die Tabelle mindestens zwei Zeilen und drei Spalten aufweist und dass die Tabelle Text in der Zelle enthält, die sich an der Position der zweiten Zeile und der dritten Spalte befindet. Beim Aufruf der ChangeTextInCell-Methode in Ihrem Programm wird der Text in der Zelle an der angegebenen Position durch den Text ersetzt, den Sie als zweites Argument an die ChangeTextInCell-Methode übergeben. In der folgenden Tabelle wurde der Text „Der Text aus dem API-Beispiel“ verwendet.

Beliebiger Text Beliebiger Text Beliebiger Text
Beliebiger Text Beliebiger Text Der Text aus dem API-Beispiel

Beispielcode

Die ChangeTextinCell-Methode ändert den Text in der zweiten Zeile und der dritten Spalte der ersten Tabelle, die in der Datei gefunden wird. Sie rufen diese Methode auf, indem Sie einen vollständigen Pfad als ersten Parameter und den zu verwendenden Text als zweiten Parameter an die Datei übergeben. Der folgende Aufruf der ChangeTextInCell-Methode ändert beispielsweise den Text in der angegebenen Zelle in „Der Text aus dem API-Beispiel“.

    ChangeTextInCell(@"c:\Users\Public\Documents\word4.docx",
    "The text from the API example");

Nachstehend ist das vollständige Codebeispiel aufgeführt.

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

ChangeTextInCell(args[0], args[1]);

// Change the text in a table in a word processing document.
static void ChangeTextInCell(string filePath, string txt)
{
    // Use the file name and path passed in as an argument to 
    // open an existing document.            
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
    {
        if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        // Find the first table in the document.
        Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();

        // Find the second row in the table.
        TableRow row = table.Elements<TableRow>().ElementAt(1);

        // Find the third cell in the row.
        TableCell cell = row.Elements<TableCell>().ElementAt(2);

        // Find the first paragraph in the table cell.
        Paragraph p = cell.Elements<Paragraph>().First();

        // Find the first run in the paragraph.
        Run r = p.Elements<Run>().First();

        // Set the text for the run.
        Text t = r.Elements<Text>().First();
        t.Text = txt;
    }
}