2015-07-01 11 views
8

Najpierw muszę wyjaśnić mój problem, mam natywną aplikację zapytań, gdzie ktoś pisze w "Wybierz .... to i tamto", a wynik jest obecnie wyświetlane w siatce, która jest podzielona na strony i poproszono mnie o dodanie przycisku, który wyeksportuje dane do programu Excel bezpośrednio z bezodrzuconego strumienia danych. mój obecny kod, który znalazłem, używa siatki i nadal nie zachęca mnie do pobrania pliku .xls z jakiegoś powodu.Chcę wysłać natywne zapytanie natywne do Excela za pomocą WebGrid

 [Authorize(Roles = "Portal administrator")] 
    public void ExportExcel(NativeQueryVM model, int? page, string sort) 
    { 
     List<Dictionary<string, object>> result = null; 
     String vartimedate = DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss"); 
     try 
     { 
      var user = Membership.GetUser(); 
      var grid = new System.Web.UI.WebControls.GridView(); 
      if (page == null && sort == null) 
      { 
       if (model.QueryText.ToUpper().StartsWith("SELECT")) 
       { 
        UserQueryInput queryinput = new UserQueryInput(); 
        queryinput.DatabaseId = model.selectedDatabase; 
        queryinput.QueryText = model.QueryText; 
        result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, queryinput, "Set"); 
        model.QueryResultData = result; 
        ViewBag.SubmitType = "Select"; 
        CreateDynamicResult(model.QueryResultData); 
        if (model == null || model.QueryResultData.Count == 0) 
        { 
         ViewBag.ResultMessage = "No Results Found"; 
        } 
        else 
        { 

         WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false); 

         string griddata = wd.GetHtml().ToString(); 
         string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls"; 
         Response.ClearContent(); 
         Response.AddHeader("content-disposition", attachment); 
         Response.ContentType = "application/excel"; 
         StringWriter sw = new StringWriter(); 
         HtmlTextWriter htw = new HtmlTextWriter(sw); 
         Response.Write(griddata); 
         Response.End(); 
        } 
       } 

      } 
      else 
      { //This part should come when page or sort is not null for Select. Should not be executed other than SELECT 
       result = lookupProvider.GetSetNativeQuery((Guid)user.ProviderUserKey, user.UserName, null, "Get"); 
       model.QueryResultData = result; 
       ViewBag.SubmitType = "Select"; 
       CreateDynamicResult(model.QueryResultData); 
       if (model == null || model.QueryResultData.Count == 0) 
       { 
        ViewBag.ResultMessage = "No Results Found"; 
       } 
       else 
       { 

       } 
      } 

     } 
     catch (Exception ex) 
     { 
      logger.Log(new LogMessage() 
      .ForMethod("SubmitQuery") 
      .WithContext(Environment.MachineName) 
      .WithException(ex) 
      .WithDescription("An error occurred while submiting query to get result")); 
     } 
    } 
+0

W kodzie spróbować Response.Output.Write (griddata), gdzie masz Response.Write (griddata). –

Odpowiedz

0

Cześć wszystkim, odpowiedział ten problem, i znalazłem odpowiedź i problemy z przebywania na zewnątrz kod, który wprowadziłem do pytania. Jquery przechwytywał dane wyjściowe mojego strumienia plików, az drugiej strony, jeśli przycisk został utworzony z runat = server, model jest poza zakresem, a główna część rozwiązania wymagała zapisania modelu do sesji i ponownego wciągnięcia go.

Dzięki za pomoc wszystkim ...

-1

Jak nazywa się tę pustą funkcję? Ścieżki powrotu obejmują ustawianie właściwości ViewBag z komunikatem o błędzie wraz z modyfikowaniem odpowiedzi. Pachnie złym projektem.

Utworzyłem hiperłącze, które prowadzi do czegoś podobnego do @Url.Action. Należy pamiętać, że trzeba by zwrócić FileContentResult z danych UTF8 zakodowany zamiast modyfikowania Response bezpośrednio:

public async Task<ActionResult> Test() 
     {     
      WebGrid wd = new WebGrid(source: ViewBag.DynamicResult, canPage: false, canSort: false); 

        string griddata = wd.GetHtml().ToString(); 
        string attachment = "attachment; filename=NativeQuery" + vartimedate + ".xls"; 
        Response.ClearContent(); 
        Response.AddHeader("content-disposition", attachment); 
        Response.ContentType = "application/excel"; 
      byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(griddata); 

      return File(buffer, "application/octet-stream"); 
     } 
Powiązane problemy