【发布时间】:2015-04-22 03:23:52
【问题描述】:
我有一个使用 Durandal、ASP.net MVC Web API、Breeze 和淘汰赛 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.
});
}
在微风中实现的数据上下文文件中,代码正在返回承诺 -
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() 方法被执行。
我不知道我哪里出错了,或者我在这里错过了什么。此外,让我知道如何处理 promise 返回的文件/数据会很有帮助。
【问题讨论】:
-
所以,我们在这篇文章中有很多内容,有必要进行一些澄清。您似乎发现了两个问题:a) 转换时间过长,b) 将 Excel 文件作为响应类型发送时出现问题。当您问“……一种方法……有点快”时,您指的是转换,还是在线时间?我问是因为您提到“移动”。另外,请提供您的响应标头和内容类型配置。如果您能澄清“我在发送时遇到问题...”的意思,这也会有所帮助
-
@EricTaylor 我已经更新了帖子。希望它能让事情变得更清楚。
-
您可能想看看 Ward 的回答。
-
我希望有人能回答如何让用户在这样的 SPA 中下载文件。你有想过吗?
-
很遗憾没有:(
标签: javascript json excel asp.net-web-api breeze