【发布时间】:2014-01-28 13:27:33
【问题描述】:
我有一个 MVC Razor 应用程序,我在其中返回一个视图。 我已经重载了我的操作以接受一个可以为空的“导出”布尔值,这将通过添加标题来更改操作,但仍然返回与文件相同的视图(在新窗口中)。
//if there is a value passed in, set the bool to true
if (export.HasValue)
{
ViewBag.Exporting = true;
var UniqueFileName = string.Format(@"{0}.xls", Guid.NewGuid());
Response.AddHeader("content-disposition", "attachment; filename="+UniqueFileName);
Response.ContentType = "application/ms-excel";
}
由于文件是基于视图生成的,它不是 .xls 文件,因此打开它时,我收到消息“文件格式和扩展名不匹配”。所以在谷歌之后,我在 SO 上找到了THIS POST,其中一个答案使用 VBA 打开服务器上的文件(包括 HTML 标记)然后再次保存(作为 .xls)。
我希望也这样做,调用将调用视图的控制器操作并在服务器上创建 .xls 文件,然后让服务器打开它,保存它然后将其作为下载返回。
我不想做的是创建一个新视图来返回一个干净的文件,因为当前视图是一个极其复杂的页面,其中包含许多只需要重复(和维护)的逻辑。
我在视图中所做的是将除表格之外的所有内容包装在 if statement 中,以便只导出表格而不导出页面布局的其余部分。
这可能吗?
【问题讨论】:
-
所以你的视图除了你改变了内容类型并添加了 content-disposition 标头之外,仍然输出 HTML?
-
是的,没错。我希望能够导出格式化的表格、颜色等。我遇到的问题是视图中有大量的逻辑,超过 400 行。我不想在控制器操作中重新编码每个视图。到目前为止它有效,但您收到有关文件格式的警告消息,但我试图让 Web 服务器打开文件然后执行“另存为”以尝试放弃导致警告的 html 并呈现格式化的 .xls 给用户。
-
你想做的事是不可能的!您必须生成一个 excel 文件而不是 HTML
-
哦...读完这篇文章stackoverflow.com/a/9575683/2394259 后我很乐观,但那是VBA,不是在控制器操作中完成的。回到绘图板 - 谢谢
-
哦等等。我想念你的问题。控制器操作可以从另一个操作的 HTML 输出生成 excel 文件。虽然设计明智并且在服务器中运行 excel 可能是有问题的,但它很丑!我有过不好的经历。让我尝试编写代码。
标签: asp.net-mvc excel razor export-to-excel