下面的代码转换将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");
如何将扩展程序添加到文件中?
答案 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);