Hinzufügen von Tabellen zu Textverarbeitungsdokumenten
In diesem Thema wird gezeigt, wie Sie die Klassen im Open XML SDK für Office verwenden, um einem Textverarbeitungsdokument programmgesteuert eine Tabelle hinzuzufügen. Sie enthält eine Beispielmethode AddTable
zur Veranschaulichung dieser Aufgabe.
AddTable-Methode
Sie können die AddTable
-Methode verwenden, um einem Textverarbeitungsdokument eine einfache Tabelle hinzuzufügen. Die AddTable
-Methode akzeptiert zwei Parameter, die Folgendes angeben:
Den Namen des zu ändernden Dokuments (Zeichenfolge)
Ein zweidimensionales Zeichenfolgenarray zum Einfügen in das Dokument als Tabelle
static void AddTable(string fileName, string[,] data)
Aufrufen der AddTable-Methode
Die AddTable
-Methode ändert das von Ihnen angegebene Dokument und fügt eine Tabelle hinzu, die die Informationen in dem von Ihnen bereitgestellten zweidimensionalen Array enthält. Übergeben Sie zum Aufrufen der Methode alle Parameterwerte entsprechend dem folgenden Beispielcode.
string fileName = args[0];
AddTable(fileName, new string[,] {
{ "Hawaii", "HI" },
{ "California", "CA" },
{ "New York", "NY" },
{ "Massachusetts", "MA" }
});
Funktionsweise des Codes
Der folgende Code beginnt mit dem Öffnen des Dokuments mit der Open -Methode und gibt an, dass das Dokument für Lese-/Schreibzugriff geöffnet sein soll (der endgültige true
Parameterwert). Als Nächstes ruft der Code einen Verweis auf das Stammelement des Standard Dokumentteils ab, wobei die Document -Eigenschaft desMainDocumentPart -Elements des Textverarbeitungsdokuments verwendet wird.
using (var document = WordprocessingDocument.Open(fileName, true))
{
if (document.MainDocumentPart is null || document.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
var doc = document.MainDocumentPart.Document;
Erstellen des Tabellenobjekts und Festlegen seiner Eigenschaften
Bevor Sie eine Tabelle in ein Dokument einfügen können, müssen Sie das Table Objekt erstellen und dessen Eigenschaften festlegen. Um die Eigenschaften einer Tabelle festzulegen, erstellen Sie Werte für ein -Objekt und geben sie an TableProperties . Die TableProperties
-Klasse stellt viele tabellenorientierte Eigenschaften bereit, z. B Shading. , TableBorders, TableCaption, TableCellProperties, TableJustification, und mehr. Die Beispielmethode enthält den folgenden Code.
Table table = new();
TableProperties props = new(
new TableBorders(
new TopBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new BottomBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new LeftBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new RightBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideHorizontalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideVerticalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
}));
table.AppendChild<TableProperties>(props);
Mit dem Konstruktor für die TableProperties
-Klasse können Sie beliebig viele untergeordnete Elemente angeben (ähnlich wie der XElement Konstruktor). In diesem Fall erstellt TopBorderder Code die untergeordneten Elemente , BottomBorder, LeftBorder, RightBorder, InsideHorizontalBorderund InsideVerticalBorder , die jeweils eines der Rahmenelemente für die Tabelle beschreiben. Für jedes Element legt der Code die Val
Eigenschaften und Size
als Teil des Aufrufs des Konstruktors fest. Das Festlegen der Größe ist einfach, aber das Festlegen der Val
Eigenschaft erfordert etwas mehr Aufwand: Diese Eigenschaft für dieses bestimmte Objekt stellt die Rahmenart dar, und Sie müssen sie auf einen Aufzählungswert festlegen. Erstellen Sie dazu eine instance des EnumValue<T> generischen Typs, und übergeben Sie dabei den spezifischen Rahmentyp (BorderValues) als Parameter an den Konstruktor. Nachdem der Code den gesamten Tabellenrahmenwert festgelegt hat, den er festlegen muss, ruft er die AppendChild -Methode der Tabelle auf und gibt an, dass der generische Typ istTableProperties, d. h., er fügt eine instance der TableProperties
-Klasse an, wobei die Variable props
als Wert verwendet wird.
Füllen der Tabelle mit Daten
Angesichts dieser Tabelle und ihrer Eigenschaften ist es jetzt an der Zeit, die Tabelle mit Daten zu füllen. Die Beispielprozedur durchläuft zuerst alle Datenzeilen im von Ihnen angegebenen Zeichenfolgenarray und erstellt für jede Datenzeile einen neuen TableRow instance. Der folgende Code zeigt, wie Sie die Zeile erstellen und an die Tabelle anfügen. Anschließend erstellt der Code für jede Spalte ein neues TableCell -Objekt, füllt es mit Daten und fügt es an die Zeile an.
Als Nächstes bewirkt der Code Folgendes:
- Erstellt ein neues Text -Objekt, das einen Wert aus dem Array von Zeichenfolgen enthält.
- Übergibt das Text -Objekt an den Konstruktor für ein neues Run -Objekt.
- Übergibt das Run -Objekt an den Konstruktor für ein neues Paragraph -Objekt.
- Übergibt das Paragraph -Objekt an die Append -Methode der Zelle.
Der Code fügt dann ein neues TableCellProperties -Objekt an die Zelle an. Dieses TableCellProperties
Objekt kann wie das TableProperties
Bereits gesehene Objekt so viele Objekte in seinem Konstruktor akzeptieren, wie Sie angeben möchten. In diesem Fall übergibt der Code nur ein neues TableCellWidth -Objekt, dessen Type -Eigenschaft auf TableWidthUnitValues festgelegt ist (sodass die Tabelle automatisch die Breite jeder Spalte ändert).
for (var i = 0; i < data.GetUpperBound(0); i++)
{
var tr = new TableRow();
for (var j = 0; j < data.GetUpperBound(1); j++)
{
var tc = new TableCell();
tc.Append(new Paragraph(new Run(new Text(data[i, j]))));
// Assume you want columns that are automatically sized.
tc.Append(new TableCellProperties(
new TableCellWidth { Type = TableWidthUnitValues.Auto }));
tr.Append(tc);
}
table.Append(tr);
}
Fertig stellen
Durch den folgenden Code erfolgt abschließend das Anfügen der Tabelle an den Text des Dokuments und dann das Speichern des Dokuments.
doc.Body.Append(table);
Beispielcode
Es folgt das vollständige AddTable-Codebeispiel in C# und Visual Basic.
static void AddTable(string fileName, string[,] data)
{
if (data is not null)
{
using (var document = WordprocessingDocument.Open(fileName, true))
{
if (document.MainDocumentPart is null || document.MainDocumentPart.Document.Body is null)
{
throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
}
var doc = document.MainDocumentPart.Document;
Table table = new();
TableProperties props = new(
new TableBorders(
new TopBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new BottomBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new LeftBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new RightBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideHorizontalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
},
new InsideVerticalBorder
{
Val = new EnumValue<BorderValues>(BorderValues.Single),
Size = 12
}));
table.AppendChild<TableProperties>(props);
for (var i = 0; i < data.GetUpperBound(0); i++)
{
var tr = new TableRow();
for (var j = 0; j < data.GetUpperBound(1); j++)
{
var tc = new TableCell();
tc.Append(new Paragraph(new Run(new Text(data[i, j]))));
// Assume you want columns that are automatically sized.
tc.Append(new TableCellProperties(
new TableCellWidth { Type = TableWidthUnitValues.Auto }));
tr.Append(tc);
}
table.Append(tr);
}
doc.Body.Append(table);
}
}
}