2015-02-20 1 views
1

У меня есть одностраничное приложение (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() выполняется.

Я не знаю, где я ошибаюсь или что упускаю здесь. Кроме того, было бы очень полезно дать мне знать, как обрабатывать файл/данные, которые возвращают обещание.

+0

Итак, в этом посте у нас много, и необходимо некоторое разъяснение. Казалось бы, вы идентифицируете две проблемы: a) слишком много времени в преобразовании и b) проблема отправки файла Excel в качестве типа ответа. Когда вы спрашиваете: «... способ сделать это ... немного быстро», вы имеете в виду конверсию или время на проводе? Я спрашиваю, потому что вы упоминаете «мобильный». Кроме того, предоставьте свои заголовки ответов и типы содержимого. Это тоже помогло бы, если бы вы могли уточнить, что вы подразумеваете под «У меня проблема с отправкой ...» –

+0

@ ЭрикТейлор Я обновил сообщение. Надеюсь, что это немного улучшит ситуацию. – gkb

+0

Возможно, вы захотите взглянуть на ответ Уорда. –

ответ

0

Мой инстинкт заключается в том, что BreezeJS является неправильным инструментом для этой конкретной работы ... и я говорю это как соавтор BreezeJS.

Проблема начинается с парадигмы. У меня возникают проблемы с представлением строк в виде таблиц как «сущностей» в обычном смысле бизнес-объектов. Они кажутся мне более похожими на простые данные.

В этом примере мы очень далеки от сущностного мышления. Кажется, вы готовите большой кусок HTML для отображения на клиенте. В этом нет ничего «сущностного».

У меня нет ссоры с вашими намерениями. Но я думаю, что вы должны относиться к этому так же, как к любому другому необработанному ресурсу (например, к изображениям) и извлекать его с помощью простого AJAX, используя любой компонент, доступный для вас.

Возможно, вы создаете гибридное приложение, в котором у вас есть как исходные данные (или HTML), так и модель сущности. Breeze - прекрасный инструмент для приложения, если вы его применяете соответствующим образом. Приложение Breeze уже делегирует компонент AJAX низкого уровня (например, jQuery.ajax или Angular's $http), и вы сможете найти этот компонент в базе кода и использовать его непосредственно для этой конкретной задачи csv.