2014-10-28 3 views
3

Имея некоторые проблемы с экспортом в загружаемый контент Excel, используя AngularJS & ASP.NET MVC. Мои конечные результаты ничего не происходит. МетодЭкспорт в Excel не работает

Пример ASP.NET контроллера:

[HttpPost] 
public ActionResult ExportToExcel(Model form) 
{ 
    var gv = new GridView(); 
    gv.DataSource = _service.getSomeStuff(form); 
    gv.DataBind(); 
    Response.ClearContent(); 
    Response.Buffer = true; 
    Response.AddHeader("content-disposition", "attachment; filename=Stuff.xls"); 
    Response.ContentType = "application/ms-excel"; 
    Response.Charset = ""; 
    var sw = new StringWriter(); 
    var htw = new HtmlTextWriter(sw); 
    gv.RenderControl(htw); 
    Response.Output.Write(sw.ToString()); 
    Response.Flush(); 
    Response.End(); 

    byte[] temp = System.Text.Encoding.UTF8.GetBytes(sw.ToString()); 
    return File(temp, "application/ms-excel"); 
} 

Угловая Метод управления: -> срабатывает через нг щелкните обработчик

function exportToExcel() { 
    $http.post('/Controller/ExportToExcel/', vm.Model) 
      .success(function (data) { 
      }) 
      .error(function (data) { 
       alerts.error(data); 
      }); 
} 

Вид:

<a href="" ng-click="vm.exportToExcel()">click me</a> 

Любые предложения о том, что Возможно, я ошибаюсь?

+1

вы вызываете 'Response.End()' перед тем, как вы возвращаете файл. Я предполагаю, что вызывает проблемы – DLeh

+0

@ user167698, используйте либо «Response.ClearContent(); Response.Buffer = true; Response.AddHeader ("content-disposition", "attachment; filename = Stuff.xls"); Response.ContentType = "application/ms-excel"; Response.Charset = ""; var sw = new StringWriter(); var htw = new HtmlTextWriter (sw); gv.RenderControl (htw); Response.Output.Write (sw.ToString()); Response.Flush(); Response.End(); ' \t или' byte [] temp = System.Text.Encoding.UTF8.GetBytes (sw.ToString()); return Файл (temp, "application/ms-excel"); '. Не используйте оба. – yW0K5o

+0

К сожалению, я пробовал с и без Response.End(). Никакой разницы в результате. Метод «ExportToExcel (Model form)», кажется, создает загрузку, если вызван из стандартной формы submit. – user167698

ответ

0

Я сделал что-то вроде этого, без необходимости AJAX или любого JS. Тонкая настройка кода Razor - это все, что требуется.

Во-вторых, моим личным предложением было бы вовсе не конвертировать в файл Excel. Причина в том, что пользователю необходимо иметь Office на своей локальной машине. Это также означает, что если вы загрузите свой проект на веб-сайт, то серверу потребуется установить Office для создания вашего файла excel.

Это, как говорится, я бы предложил просто использовать файл CSV. Если пользователь установил Office, они смогут использовать Excel для просмотра файла, как любая электронная таблица.

Вот код, который создаст CSV под названием Export.csv из dbset в вашем dbcontext, выполненном с использованием StringBuilder и Reflection.

public ActionResult Export() 
    { 
     StringBuilder str = new StringBuilder(); 
     var tmp = db.Users.FirstOrDefault();  
     Type comp = tmp.GetType();    // get type 
     foreach (PropertyInfo prop in comp.GetProperties()) 
     { 
      str.Append(prop.Name + ",");   //set column names 
     } 
     str.Replace(",", "\n", str.Length - 1, 1); 
     foreach (object item in db.Users) 
     { 
      foreach (PropertyInfo prop in item.GetType().GetProperties()) 
      { 
       try 
       { 
        string a = prop.GetValue(item, null).ToString(); 
        str.Append(a + ","); 
       } 
       catch (NullReferenceException) 
       { 
        str.Append("null" + ",");   //for nulls, append string with "null" 
       } 
      } 
      str.Replace(",", "\n", str.Length - 1, 1); 
     } 
     string csv = str.ToString(); 
     return File(new System.Text.UTF8Encoding().GetBytes(csv), "text/csv", "Export.csv"); 
    } 

Вы можете получить доступ скачать файл со ссылкой на вашем взгляде, как это:

<a href="@Url.Action("Export", "Controller")">click me</a> 

Надеется, что это помогает.

+0

Спасибо! Это работает хорошо. :-) – user167698

+0

Ваш прием :) – AbdulG

Смежные вопросы