在MVC中从模板创建和下载word文件

时间:2013-06-10 04:56:22

标签: asp.net-mvc file-handling

我在其中一个项目文件夹中保留了一个word文档(.docx),我想将其用作模板。
此模板包含用户的自定义页眉和页脚行。我想方便用户以word格式下载自己的数据。为此,我想编写一个接受用户数据并引用模板的函数,它将创建一个新的word文件替换模板中的占位符,然后返回新文件以供下载(不保存到服务器)。这意味着模板需要完整无缺。

以下是我的尝试。我能够替换占位符。但是,我不知道如何将创建的内容作为可下载文件提供给用户。我不想再将新内容作为另一个word文件保存在服务器中。

  public void GenerateWord(string userData)
    {
        string templateDoc = HttpContext.Current.Server.MapPath("~/App_Data/Template.docx");

        // Open the new Package
        Package pkg = Package.Open(templateDoc, FileMode.Open, FileAccess.ReadWrite);

        // Specify the URI of the part to be read
        Uri uri = new Uri("/word/document.xml", UriKind.Relative);
        PackagePart part = pkg.GetPart(uri);

        XmlDocument xmlMainXMLDoc = new XmlDocument();
        xmlMainXMLDoc.Load(part.GetStream(FileMode.Open, FileAccess.Read));

        xmlMainXMLDoc.InnerXml = ReplacePlaceHoldersInTemplate(userData, xmlMainXMLDoc.InnerXml);

        // Open the stream to write document
        StreamWriter partWrt = new StreamWriter(part.GetStream(FileMode.Open, FileAccess.Write));
        xmlMainXMLDoc.Save(partWrt);

        partWrt.Flush();
        partWrt.Close();
        pkg.Close();
    }


    private string ReplacePlaceHoldersInTemplate(string toReplace, string templateBody)
    {
        templateBody = templateBody.Replace("#myPlaceHolder#", toReplace);
        return templateBody;
    }

我相信下面一行是保存模板文件本身的内容,这是我不想要的。

xmlMainXMLDoc.Save(partWrt);

我应该如何修改此代码,以便将新内容作为可下载的word文件返回给用户?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案Here

此代码允许我阅读模板文件并根据需要进行修改,然后将响应作为可下载附件发送。