2009-10-06 5 views
0

Je crée une application C# qui remplit les champs MergeField définis sur un document MS Word avec des données provenant d'une source de données externe. J'utilise OpenXml SDK et tout fonctionne correctement lors du remplacement de champs individuels. Ce que je veux faire est, pour avoir une section avec plusieurs MergeFields définis et être capable de copier cette section plusieurs fois en fonction des données d'entrée.Comment remplacer une section dans un modèle de mots avec plusieurs champs C#

par exemple. Je peux avoir dans le document un paragraphe contenant une information de produit avec plusieurs MergeFields, mais dans les données j'ai des informations pour plusieurs produits, je veux générer autant de paragraphes dans le document de sortie que de produits dans les données d'entrée.

produit: [[product-name]], montant: [[produit montant]], le prix: [[produit prix]]

Y at-il quelque chose comme une "section logique" dans un document Word envelopper le paragraphe? sinon, quel serait votre conseil pour le faire?

Répondre

1

Vous pouvez essayer de lancer séparément la fusion sur chacune de vos lignes, puis concaténer le résultat en un seul document. Voici la méthode exemple pour joindre plusieurs documents. Dans cet exemple, j'utilise l'élément Break pour séparer mais ce n'est pas un must.

 private MemoryStream JoinDocuments(List<MemoryStream> subDocuments) 
    { 
      var sumLength = (from MemoryStream ms in subDocuments select ms.Length).Sum(); 
      MemoryStream mainDocumentStream = new MemoryStream((int)sumLength); 

      // Create a Wordprocessing document. 
      using (WordprocessingDocument myDoc = WordprocessingDocument.Create(mainDocumentStream, WordprocessingDocumentType.Document)) 
      { 
      // Add a new main document part. 
      MainDocumentPart mainPart = myDoc.AddMainDocumentPart(); 
      //Create Document tree for simple document. 
      mainPart.Document = new Document(); 
      //Create Body (this element contains other elements that we want to include 
      Body body = new Body(); 

      for (int i = 0; i < subDocuments.Count; i++) 
      { 
       var subDocument = subDocuments[i]; 
       subDocument.Position = 0; 
       string altChunkId = "AltChunkId" + i; 
       AlternativeFormatImportPart chunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altChunkId); 
       chunk.FeedData(subDocument); 

       AltChunk altChunk = new AltChunk(); 
       altChunk.Id = altChunkId; 
       body.Append(altChunk); 
       Break pageBreak = new Break(); 
       pageBreak.Type = BreakValues.Page; 
       body.Append(pageBreak); 

      } 

      mainPart.Document.Append(body); 
      // Save changes to the main document part. 
      mainPart.Document.Save(); 
      } 
      return mainDocumentStream; 
    } 
Questions connexes