У меня есть одностраничное приложение (SPA), построенное с использованием Durandal, ASP.net MVC Web API, Breeze и knockout js.Экспорт данных JSON на лист Excel с помощью ASP.Net MVC Web Api
Мне нужно экспортировать список в лист Excel, который необходимо загрузить в папку загрузки по щелчку кнопки на странице html.
Хотя я успешно это сделал, преобразовывая данные JSON в формат csv в javascript (на стороне клиента), занимает слишком много времени, если объем данных большой (3000 + строк или может быть около 12000) ,
У меня возникла проблема с отправкой файла excel в качестве типа ответа из вызова веб-API, полученного через Breeze.js.
Есть ли способ сделать это таким образом, который должен быть немного быстрым, как это может потребоваться и на мобильных устройствах?
EDIT
Ниже приведен код, который я написал -
код 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);
}
Ниже приведен код, отправленный в веб-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() выполняется.
Я не знаю, где я ошибаюсь или что упускаю здесь. Кроме того, было бы очень полезно дать мне знать, как обрабатывать файл/данные, которые возвращают обещание.
Итак, в этом посте у нас много, и необходимо некоторое разъяснение. Казалось бы, вы идентифицируете две проблемы: a) слишком много времени в преобразовании и b) проблема отправки файла Excel в качестве типа ответа. Когда вы спрашиваете: «... способ сделать это ... немного быстро», вы имеете в виду конверсию или время на проводе? Я спрашиваю, потому что вы упоминаете «мобильный». Кроме того, предоставьте свои заголовки ответов и типы содержимого. Это тоже помогло бы, если бы вы могли уточнить, что вы подразумеваете под «У меня проблема с отправкой ...» –
@ ЭрикТейлор Я обновил сообщение. Надеюсь, что это немного улучшит ситуацию. – gkb
Возможно, вы захотите взглянуть на ответ Уорда. –