将Html视图渲染为Word文档

时间:2015-01-21 18:12:55

标签: httpcontext

下面的代码转换将MVC视图作为Word文档返回,但它不会为下载的文件提供.doc扩展名。

public ActionResult ToWord()
{
    var model = Logic.GetModel();
    string html = Utils.ViewToString(this, "MyView", model);
    return Content(html, "application/msword");
}

static string ViewToString(Controller controller, string viewName, object model)
{
    controller.ViewData.Model = model;
    using (StringWriter sw = new StringWriter())
    {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
        viewResult.View.Render(viewContext, sw);
        return sw.ToString();
    }
}

我尝试添加以下代码,但扩展名似乎被忽略了。将文档保存为file.doc可使Word正常运行:

HttpContext.Response.AppendHeader("Content-Disposition", "wordFile.doc");

如何将扩展程序添加到文件中?

4 个答案:

答案 0 :(得分:2)

首先,我同意上述评论。您编写的代码不会将您的页面转换为word文档,它只是指示浏览器在Word中显示您的html。因此,使用.doc扩展名命名下载可能会导致奇怪。 IDK,没有尝试过。

话虽如此,我认为你正在寻找内容处置标题的文件名属性:

Response.AddHeader("content-disposition", "attachment; filename=whatever.doc");

答案 1 :(得分:1)

正如已经说过的那样,你不应该将html作为.doc返回,除非你转换了所说的html。

但是,您要找的是要返回的FileStreamResult

替换:

return Content(html, "application/msword");

使用:

return File(htmlStream, "application/msword", Server.UrlEncode("filename.doc"));

您可以使用以下代码从字符串生成MemoryStream:

MemoryStream htmlStream = new MemoryStream();
StreamWriter writer = new StreamWriter(htmlStream);
writer.Write(html);
writer.Flush();
htmlStream.Position = 0;

答案 2 :(得分:0)

您需要做的不仅仅是使用* .doc扩展名保存HTML。

要从HTML转到Word * .docx文件,您可以使用此处描述的“altChunk”技术:http://blogs.msdn.com/b/ericwhite/archive/2008/10/27/how-to-use-altchunk-for-document-assembly.aspx。请记住,您可以使用的HTML格式和CSS样式略有限制,但如果您在这些约束条件下工作,它可以很好地工作。

此外,您需要正确设置Content-Disposition标头,例如:"attachment; filename=whatever.doc"。请记住,如果某些浏览器包含特殊字符,则文件名可能会出现问题,因此最好使用FileResult设置FileDownloadName来使用MVC对此的支持,如下所示:

return File(System.Text.Encoding.UTF8.GetBytes(html), "application/msword", "My File Name.doc");

答案 3 :(得分:0)

我相信你的问题只是因为" .doc"扩展被截断了。关键是文件名= \"" + strFileName +" \";");这两行对我有用。

string strFileName ="员工报告" +" - " + DateTime.Now.ToString(" M / d / yyyy")+" .doc";

HttpContext.Current.Response.AddHeader(" Content-Disposition"," attachment; filename = \"" + strFileName +" \&#34 ;;&#34);