Eine Word-Vorlage in C# ohne Office ausfüllen

Jemand hat invoice.docx in Word erstellt, mit {{customer}} dort, wo der Name hingehört. Diese Anleitung zeigt, wie Sie die Datei aus C# ausfüllen: Text, sich wiederholende Tabellenzeilen und Bilder, und wie Sie das Ergebnis prüfen.

byte[] template = await HtmlToDocxConverter.ConvertAsync("<p>Customer: {{customer}}</p>");
byte[] filled = DocxEditor.ReplaceText(template, new Dictionary<string, string>
{
    ["{{customer}}"] = "Contoso Ltd",
});

Platzhalter, die Word aufteilt

  • Word teilt einen Platzhalter wie {{customer}} oft in drei oder vier separate <w:t>-Elemente auf, zum Beispiel nach der Korrektur eines Tippfehlers oder einer Rechtschreibprüfung.
  • Ein Suchen und Ersetzen im XML findet dann nichts und meldet Erfolg.
  • ReplaceText fügt die Teile wieder zusammen, bevor es vergleicht.
  • ReplaceText erreicht auch Kopf- und Fußzeilen, sodass auch ein Name im Briefkopf ersetzt wird.
  • Ein Schlüssel ohne Platzhalter lässt das Dokument unverändert. Ein Platzhalter ohne Schlüssel bleibt als wörtlicher Text stehen, etwa {{unknown}}.

Eine Zeile pro Datensatz

  • Legen Sie eine Vorlagenzeile in die Tabelle, und FillRows klont sie einmal für jeden Datensatz.
  • Jede neue Zeile behält Rahmen, Schattierung, Schriftarten und Spaltenbreiten der Vorlagenzeile.
  • Erweitern Sie zuerst die Zeilen, dann füllen Sie Einzelwerte. FillRows klont die Zeile, daher wird ein Platzhalter, der schon darin steht, in jede Zeile kopiert.
  • Der Collection-Name im Platzhalter, {{item.Desc}}, entspricht dem Argument collection, "item".

Ein Bild einsetzen

  • ReplaceImage ersetzt einen Text-Platzhalter durch Bild-Bytes.
  • Größen werden in Punkt angegeben. Geben Sie eine Größe an, und die andere skaliert mit, damit das Seitenverhältnis erhalten bleibt.
  • Das Format bestimmen die Bytes, nie ein Dateiname. Eine Datei namens logo.png, die JPEG-Bytes enthält, wird als das JPEG gelesen, das sie ist.

Das Ausfüllen prüfen

  • ExtractText gibt den Text des Dokuments als String zurück, sodass ein Test prüfen kann, ob das Ausfüllen funktioniert hat.
  • Standardmäßig lässt es Kopf- und Fußzeilen weg. Übergeben Sie includeHeadersAndFooters: true, um sie einzubeziehen.

Was es nicht kann

  • Kopfzeilen pro Abschnitt und gerade/ungerade (gespiegelte) Seiten werden nicht unterstützt. Eine abweichende erste Seite schon.
  • DocxBlock hat vier Factory-Methoden, Heading, Paragraph, Table und Image. Es ist bewusst kein Dokumentmodell; für echte Kontrolle über das Layout verwenden Sie eine Vorlage.
  • Die Schriftarten im PDF hängen von der Maschine ab, die konvertiert. Ohne installierte Schriftarten greift das PDF auf die Base-14-Standardschriften zurück. Beide werden dargestellt, sind aber nicht byte-identisch.