2016-07-01 8 views
1

ASP.NET MVC 5でOpenXMLを使用して複数のWord文書をマージしようとしていますが、Microsoft Wordから文書が破損しているというメッセージが常に出ます。Open XMLを使用してWord文書をマージするときに「破損」文書が発生する

private Stream GenerateDocument(DocumentType documentType) 
{ 
    using (var templateStream = File.OpenRead(GetTemplatePath(documentType))) 
    { 
     //some code 
     var result = documentGenerator.Generate(); 
     return result; 
    } 
} 

private Stream MergeDocuments(DocumentLibraryModel documentLibrary) 
{ 
    var documentTypes = documentLibrary.DocumentTypes.GetEnumerator(); 
    var mainStream = GenerateDocument(documentTypes.Current); 

    using (WordprocessingDocument mainDocument = WordprocessingDocument.Open(mainStream, true)) 
    { 

     XElement newBody = XElement.Parse(mainDocument.MainDocumentPart.Document.Body.OuterXml); 
     documentTypes.MoveNext(); 
     while (documentTypes.MoveNext()) 
     { 
      WordprocessingDocument tempDocument = WordprocessingDocument.Open(GenerateDocument(documentTypes.Current), true); 
      XElement tempBody = XElement.Parse(tempDocument.MainDocumentPart.Document.Body.OuterXml); 

      newBody.Add(tempBody); 
      mainDocument.MainDocumentPart.Document.Body = new Body(newBody.ToString()); 
      mainDocument.MainDocumentPart.Document.Save(); 
      mainDocument.Package.Flush(); 
     } 

    } 

    return mainStream; 
} 

ただし、ドキュメントが破損していると開きます。

アイデア?

答えて

1

問題は、この中にある:

XElement tempBody = XElement.Parse(tempDocument.MainDocumentPart.Document.Body.OuterXml);  
newBody.Add(tempBody); 

無効なWord文書を生成し身体に体を追加しています。 Word文書には、その時に1つの本文しか含めることができません。

XMLを解析する代わりに要素を複製することをお勧めします。 これを行うことができます:

using (WordprocessingDocument mainDocument = WordprocessingDocument.Open(mainStream, true)) 
{ 
    mainDocument.MainDocumentPart.Document.Body = new Body(); 

    documentTypes.MoveNext(); 
    while (documentTypes.MoveNext()) 
    { 
     using (WordprocessingDocument tempDocument = WordprocessingDocument.Open(GenerateDocument(documentTypes.Current))) 
     { 
      foreach (var element in tempDocument.MainDocumentPart.Document.Body.Elements) 
      { 
       mainDocument.MainDocumentPart.Document.Body.AppendChild(element.CloneNode(true)); 
      } 
     } 
    } 

    mainDocument.MainDocumentPart.Document.Save(); 
} 
関連する問題