我有一个使用Durandal,ASP.net MVC Web API,Breeze和knockout js构建的单页应用程序(SPA)。
我需要将列表导出到Excel工作表,只需单击html页面上的按钮即可将其下载到下载文件夹。
虽然我已经通过在javascript(客户端)将JSON数据转换为csv格式成功地完成了这项工作,但是如果数据量很大(3000 +行或大约12000),则需要花费太多时间。
我在从通过Breeze.js进行的Web API调用中将excel文件作为响应类型发送时遇到问题。
有没有办法以一种快速的方式执行此操作,因为移动设备上也可能需要这样做?
修改
以下是我写的代码 -
用于绑定的JavaScript代码 -
function exportListToExcel() {
DataContext.exportListToExcel().then(function (data) {
//Do some stuff.
});
}
在breeze中实现的数据上下文文件中,代码返回了promise -
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()方法。
我不知道我哪里出错或者我错过了什么。另外,让我知道如何处理承诺返回的文件/数据会有很大帮助。
答案 0 :(得分:0)
我的直觉是BreezeJS是这项工作的错误工具......我说这是BreezeJS的合着者。
问题始于范式。我很难将电子表格行视为通常意义上的业务对象中的“实体”。对我来说,它们看起来更像是简单的数据。
在这个例子中,我们离实体思维很远。您似乎正准备在客户端上显示大量HTML。关于这一点,没有什么“实体般的”。
我没有与你的意图争吵。但我认为你应该像处理任何其他原始资源(例如图像)那样对待它,并使用简单的AJAX使用任何可用的组件来获取它。
您可能正在构建一个混合应用程序,其中包含原始数据(或HTML)和实体模型。只要你适当地应用它,Breeze就是应用程序的一个很好的工具。您的Breeze应用程序已经委托给低级AJAX组件(例如,jQuery.ajax
或Angular的$http
),您应该能够在代码库中找到该组件并直接将其用于此特定的csv任务。