使用ASP.Net MVC Web Api将JSON数据导出到Excel工作表

我有一个单页面应用程序(SPA)使用Durandal,ASP.net MVC Web API,微风和淘汰js。

我需要将一个列表导出到一个Excel表格,该表格应该被下载到下载文件夹,只需点击html页面上的一个button即可。

虽然我已经成功地通过在JavaScript(在客户端)将JSON数据转换为csv格式来完成,但是如果数据量很大(3000 +行或可以是12000左右),则花费的时间太多。

我在通过Breeze.js进行的Web API调用中将Excel文件作为响应types发送时遇到问题。

有没有办法做到这一点应该是一个快速的方式,因为它也可能需要在移动设备上?

编辑

下面是我写的代码 –

用于绑定的JavaScript代码 –

function exportListToExcel() { DataContext.exportListToExcel().then(function (data) { //Do some stuff. }); } 

在微风中实现的数据上下文中,代码正在返回诺言 –

 function exportListToExcel() { function querySucceeded() { //return data; } return util.sendRequest(config.baseApiPath + 'breeze/MyController/ExportListToExcel') .then(querySucceeded) .fail(queryFailed); } 

下面的代码是发送到Web API的请求。 我不知道是否应该是HttpPost或其他东西。

 [HttpPost] public HttpResponseMessage ExportListToExcel() { return ExportListToExcel(); } 

下面是后端代码 –

 public static HttpResponseMessage ExportListToExcel() { //Method which returns table data. This is working fine though. object listObject = GetListData(); Table listData = (Table)listObject; string attachment = "attachment; filename=Report.xlsx"; HttpResponseMessage File = new HttpResponseMessage(HttpStatusCode.OK); System.Web.HttpContext.Current.Response.ClearContent(); System.Web.HttpContext.Current.Response.AddHeader("content-disposition", attachment); System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; StringBuilder str = new StringBuilder(); str.Append("<table border=`" + "1px" + "`b>"); str.Append("<tr>"); foreach (DataColumn dc in listData.Columns) { str.Append("<td><b><font face=Arial Narrow size=3>" + dc.ColumnName + "</font></b></td>"); } str.Append("</tr>"); foreach (DataRow dr in listData.Rows) { str.Append("<tr>"); for (int i = 0; i < listData.Columns.Count; i++) { str.Append("<td><font face=Arial Narrow size=" + "14px" + ">" + dr[i].ToString() + "</font></td>"); } str.Append("</tr>"); } str.Append("</table>"); byte[] temp = System.Text.Encoding.UTF8.GetBytes(str.ToString()); //To write the table to the File content. File.Content = new StringContent(temp.ToString()); return File; } 

但是这不起作用,在数据上下文文件中,执行queryFailed()方法。

我不知道我在哪里错了,或者我在这里错过了什么。 另外,让我知道如何处理承诺返回的文件/数据将是很有帮助的。

我的直觉是,BreezeJS是这个特定工作的错误工具……我说这是BreezeJS的合着者。

麻烦从范例开始。 在通常意义上的业务对象中,我无法将电子表格行视为“实体”。 他们看起来更像是简单的数据给我。

在这个例子中,我们离实体思维很远。 您似乎准备在客户端上显示一大块HTML。 关于这个没有什么“实体”。

我没有与你的意图争吵。 但是我认为你应该像对其他任何原始资源(例如图像)一样对待它,并使用任何可用的组件来获取它。

您可能正在构build混合应用程序,其中既有原始数据(或HTML)又有实体模型。 微风是一个适用于应用程序的好工具,只要你适当的应用。 您的Breeze应用程序已经委托给一个低级别的AJAX组件(例如, jQuery.ajax或Angular的$http ),您应该能够在您的代码库中find该组件,并将其直接用于此特定的csv任务。

Interesting Posts