2016-11-22 1 views
-1

Comment générer une lettre série docx dans une application ASP.NET MVC? Je peux remplir un simple template docx avec des données de DB en utilisant docx avec Content Controls et la bibliothèque OpenXML - comme suggéré par exemple here. Toutefois, lorsque vous essayez d'utiliser cette fonction pour la lettre série et fusionner des documents générés en docx à sortie unique (indice here), la lettre série résultante contient les données de la première entrée - par ex. Lorsque je produisais une lettre pour 10 employés et fournissaient ces données, la production résultante générait 10 lettres mais toutes avec les données du premier employé.Comment créer par programme la lettre série de Word et la stocker en tant que document unique?

Edit: (exemple de code ajouté)

internal static Stream CreateMultiPartDocument(IList<object> data, string templatePath) 
{ 
    Stream mainDocumentStream = CreateTempDocument(data[0], templatePath);    

    for(int i = 1; i < data.Count; i++) 
    { 
     object childDocumentData = data[i]; 
     Stream childDocumentStream = CreateTempDocument(childDocumentData, templatePath); 

     AppendChildDocument(mainDocumentStream, childDocumentStream); 
    } 

    mainDocumentStream.Flush(); 
    mainDocumentStream.Position = 0; 

    return mainDocumentStream; 
} 


internal static Stream CreateTempDocument(object data, string templatePath) 
{ 
    string fullTemplatePath = Path.Combine(TEMPLATE_BASE_PATH, templatePath); 
    FileStream templateFile = File.Open(fullTemplatePath, FileMode.Open); 

    if(null != templateFile) 
    {     
     MemoryStream fileInMemory = new MemoryStream(); 
     templateFile.CopyTo(fileInMemory); 

     string customXML = data.SerializeToXml(); 

     ReplaceCustomXmlInMemory(fileInMemory, customXML); 
     fileInMemory.Flush(); 
     fileInMemory.Position = 0; 

     templateFile.Close(); 
     return fileInMemory; 
    } 

    return null; 
} 

private static void ReplaceCustomXmlInMemory(MemoryStream fileInMemory, string customXML) 
{ 
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(fileInMemory, true)) 
    { 
     MainDocumentPart mainPart = wordDoc.MainDocumentPart; 
     mainPart.DeleteParts(mainPart.CustomXmlParts); 
     CustomXmlPart customXmlPart = mainPart.AddCustomXmlPart(CustomXmlPartType.CustomXml); 
     using (StreamWriter streamWriter = new StreamWriter(customXmlPart.GetStream())) 
     { 
      streamWriter.Write(customXML); 
     } 

     wordDoc.Close(); 
    } 
} 
+1

Si vous avez écrit du code pour cela mais que vous n'arrivez pas à le faire fonctionner, alors vous êtes au bon endroit: ajoutez simplement votre code (ou les parties pertinentes) à la question. Sans cela, nous ne pouvons pas aider. S'il vous plaît voir https://stackoverflow.com/help/how-to-ask –

Répondre

0

La seule solution que j'ai pu trouver est de passer de OpenXml à la bibliothèque fileformats Syncfusion - ils prennent en charge la fonctionnalité de publipostage à partir de zéro, avec plusieurs formats d'entrée possible . Voir le lien here. Il est également disponible en paquet Nuget, donc c'était super simple.