Remplir un modèle Word en C# sans Office

Quelqu'un a créé invoice.docx dans Word, avec {{customer}} à l'endroit du nom. Ce guide montre comment le remplir depuis C# : texte, lignes de tableau répétées et images, puis comment vérifier le résultat.

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

Les placeholders que Word découpe

  • Word découpe souvent un placeholder comme {{customer}} en trois ou quatre éléments <w:t> distincts, par exemple après la correction d'une faute de frappe ou une vérification orthographique.
  • Un rechercher-remplacer sur le XML ne trouve alors rien et signale un succès.
  • ReplaceText recolle les morceaux avant de chercher la correspondance.
  • ReplaceText atteint aussi les en-têtes et pieds de page, donc un nom dans un en-tête de lettre est remplacé lui aussi.
  • Une clé sans placeholder laisse le document inchangé. Un placeholder sans clé reste tel quel, en texte littéral, par exemple {{unknown}}.

Une ligne par enregistrement

  • Placez une ligne modèle dans le tableau, et FillRows la clone une fois pour chaque enregistrement.
  • Chaque nouvelle ligne garde les bordures, la trame de fond, les polices et les largeurs de colonne de la ligne modèle.
  • Développez d'abord les lignes, puis remplissez les valeurs uniques. FillRows clone la ligne, donc un placeholder qui s'y trouve déjà est copié dans chaque ligne.
  • Le nom de collection dans le placeholder, {{item.Desc}}, correspond à l'argument collection, "item".

Mettre une image à la place

  • ReplaceImage remplace un placeholder texte par les octets d'une image.
  • Les tailles sont en points. Donnez une dimension, et l'autre s'ajuste pour garder les proportions.
  • Le format est déterminé par les octets, jamais par un nom de fichier. Un fichier nommé logo.png qui contient des octets JPEG est lu comme le JPEG qu'il est.

Vérifier le remplissage

  • ExtractText renvoie le texte du document sous forme de chaîne, pour qu'un test puisse vérifier que le remplissage a fonctionné.
  • Par défaut, il omet les en-têtes et pieds de page. Passez includeHeadersAndFooters: true pour les inclure.

Ce qu'il ne fait pas

  • Les en-têtes par section et les pages paires/impaires (en miroir) ne sont pas pris en charge. Une première page distincte, si.
  • DocxBlock a quatre fabriques, Heading, Paragraph, Table et Image. Ce n'est volontairement pas un modèle objet de document ; pour un vrai contrôle de la mise en page, utilisez un modèle.
  • Les polices du PDF dépendent de la machine qui fait la conversion. Sans police installée, le PDF se rabat sur les polices standard base-14. Les deux s'affichent, mais ne sont pas identiques octet pour octet.