2016-11-22 11 views
-1

どのようにしてdocxシリアルレターをASP.NET MVCアプリケーションで生成できますか? コンテンツコントロールとOpenXMLライブラリを持つdocxを使用して、簡単なdocxテンプレートにDBからのデータを入力できます(例:here)。プログラムでWordのシリアルレターを作成し、それを単一の文書として保存する方法は?

しかし、これをシリアル文字に使用し、生成されたドキュメントを単一の出力docx(ヒントhere)にマージしようとすると、結果のシリアルレターには最初のエントリのデータがあります。私が10人の従業員の手紙を作成してこのデータをフィードしていたとき、結果として出力された10文字はすべて第1従業員のデータで生成されました。

編集:私は見つけることができた唯一の解決策は、SyncfusionのFileFormatsライブラリにのOpenXmlから切り替えることです

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

これについていくつかのコードを書いていますが、動作させることができない場合は、適切な場所に来ています。質問にコード(または関連する部分)を追加するだけです。それがなければ私たちは手助けできません。 https://stackoverflow.com/help/how-to-askをご覧ください。 –

答えて

0

(サンプルコードが追加された) - 彼らは最初から差し込み印刷機能をサポートし、可能な入力の複数のフォーマットで。リンクhereを参照してください。 それはNugetパッケージとしても利用できるので、とてもシンプルでした。

関連する問題