导出到Excel不起作用

在使用AngularJS&ASP.NET MVC导出可下载的Excel内容时遇到一些麻烦。 我最终的结果是没有任何反应。

示例ASP.NET控制器方法:

[HttpPost] public ActionResult ExportToExcel(Model form) { var gv = new GridView(); gv.DataSource = _service.getSomeStuff(form); gv.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=Stuff.xls"); Response.ContentType = "application/ms-excel"; Response.Charset = ""; var sw = new StringWriter(); var htw = new HtmlTextWriter(sw); gv.RenderControl(htw); Response.Output.Write(sw.ToString()); Response.Flush(); Response.End(); byte[] temp = System.Text.Encoding.UTF8.GetBytes(sw.ToString()); return File(temp, "application/ms-excel"); } 

Angular Controller方法: – >通过ng-click处理程序触发

 function exportToExcel() { $http.post('/Controller/ExportToExcel/', vm.Model) .success(function (data) { }) .error(function (data) { alerts.error(data); }); } 

视图:

 <a href="" ng-click="vm.exportToExcel()">click me</a> 

有什么我可能做错的build议?

我做了这样的事情,而不需要AJAX或任何JS。 调整剃刀代码是所有必需的。

其次,我个人的build议是根本不转换成Excel文件。 原因是,用户需要在他的本地机器上安装Office。 这也意味着,如果你上传你的项目到一个网站,该服务器将需要安装Office来生成你的Excel文件。

这就是说,我会build议只使用一个CSV文件。 如果用户安装了Office,他们将能够使用Excel来像查看任何电子表格一样查看文件。

下面是一些代码,将使用StringBuilderReflection在dbcontext中从dbset创build一个名为Export.csv的CSV。

 public ActionResult Export() { StringBuilder str = new StringBuilder(); var tmp = db.Users.FirstOrDefault(); Type comp = tmp.GetType(); // get type foreach (PropertyInfo prop in comp.GetProperties()) { str.Append(prop.Name + ","); //set column names } str.Replace(",", "\n", str.Length - 1, 1); foreach (object item in db.Users) { foreach (PropertyInfo prop in item.GetType().GetProperties()) { try { string a = prop.GetValue(item, null).ToString(); str.Append(a + ","); } catch (NullReferenceException) { str.Append("null" + ","); //for nulls, append string with "null" } } str.Replace(",", "\n", str.Length - 1, 1); } string csv = str.ToString(); return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Export.csv"); } 

然后你可以通过你的视图上的链接访问下载文件,如下所示:

 <a href="@Url.Action("Export", "Controller")">click me</a> 

希望这可以帮助。