使用OpenXML在内存中合并Word文档时出现“损坏”文档

时间:2016-07-01 08:35:21

标签: c# .net asp.net-mvc openxml

我正在尝试使用OpenXML在ASP.NET MVC 5上合并多个Word文档。但我不断从Microsoft 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 个答案:

答案 0 :(得分:1)

问题在于:

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

您正在将正文添加到生成无效Word文档的正文。 Word文档当时只能包含一个Body。

我建议克隆元素而不是解析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();
}