2013-06-14 5 views
5

Ho sviluppato un'applicazione in cui sto recuperando i dati dal database, legandolo a una rete Infragistics e quindi utilizzando excel utilizzando la relativa utilità di esportazione.Processo di download Excel muoiono la pagina in caso di set di dati di grandi dimensioni in ASP.NET

C'è un problema con questo approccio quando set di dati è di grandi dimensioni (ad esempio 20000 record o più), si 'll vuole molto tempo per elaborare e scaricare, e di solito si' ll morire pagina e mostrare pagina vuota per utente.

Esiste un approccio migliore per gestire questo problema e apportare miglioramenti ragionevoli nel processo excel ?

codice è come un qualcosa sotto:

public void LoadExcelPostingData() 
     { 
      try 
      { 
       query = "Some complex query here with up to 10 columns"; 
       dt.Clear(); 
       dt = new DataTable(); 
       db2.GetDataTable(query, CommandType.Text, ref dt); 

       grdJurdata.DataSource = dt; 
       grdJurdata.DataBind(); 

       ExportToExcel(); 
      } 
      catch (Exception ex) 
      { 
       lblresult.Text = "Grd Err : " + ex.Message; 
      } 

     } 
    private void ExportToExcel() 
     { 
      try 
      { 
       // Infragistics built in excel export utility 
       UltraWebGridExcelExporter2.Export(grdJurdata);    
      } 
      catch (Exception ex) 
      { } 

     } 
+0

Semplicemente è necessario un buon meccanismo per scaricare file Excel di grandi dimensioni. Destra? – Freak

+0

Condividi il tuo codice – Freak

+0

@freak, sto chiedendo/cercando un buon meccanismo !!! –

risposta

2

Per quanto riguarda il download di file di MSDN di Microsoft forniscono una detailed explanation

  • Ottiene la risposta
  • Con la risposta, impostare il tipo di contenuto su "APPLICATION/OCTET-STREAM" (significa che non c'è nessuna applicazione per aprire il file).
  • Impostare l'intestazione su "Content-Disposition", "attachment; filename = \" "+ +" \ "".
  • Scrivi il contenuto del file nella risposta.
  • Chiudere la risposta.

Anche tenere a mente che non usare mai richiesta Ajax per scaricare il file perché per il trasferimento di file, ha bisogno di completa PostBack Richiesta
Ecco il codice di esempio dato su MSDN

<% 
try 
{ 
    System.String filename = "myFile.txt"; 

    // set the http content type to "APPLICATION/OCTET-STREAM 
    Response.ContentType = "APPLICATION/OCTET-STREAM"; 

    // initialize the http content-disposition header to 
    // indicate a file attachment with the default filename 
    // "myFile.txt" 
    System.String disHeader = "Attachment; Filename=\"" + filename + 
     "\""; 
    Response.AppendHeader("Content-Disposition", disHeader); 

    // transfer the file byte-by-byte to the response object 
    System.IO.FileInfo fileToDownload = new 
     System.IO.FileInfo("C:\\downloadJSP\\DownloadConv\\myFile.txt"); 
    Response.Flush(); 
    Response.WriteFile(fileToDownload.FullName);} 
catch (System.Exception e) 
// file IO errors 
{ 
    SupportClass.WriteStackTrace(e, Console.Error); 
} 
%> 



Propongo inoltre leggi this good discussion

Modifica # 1: Un'altra soluzione per il tuo caso è Crea una nuova pagina per contenere UltraWebGridExcelExport er, e nella tua pagina principale, crea un tag iframe per contenere quella nuova pagina. Lascia il postback dell'iframe. E aggiorna anche la tua versione di Infgraistics alla più recente.

+0

Pensa che si comporterà bene in caso di set di dati di grandi dimensioni. Se proviamo ad ottenere la risposta direttamente e cerchiamo di esportarla in Excel, allora potrebbe verificarsi un'eccezione di memoria IO. Vorresti spiegarlo per favore? –

+0

Sì, dovrebbe essere. Dovresti provare con questo codice – Freak

+0

OK, certo. Proverò questo approccio. –

0

prima cosa è necessario relook il codice come hai scritto. hai bisogno di rifattorizzare o migliorare il codice base.

se si vuole aumentare il timeout richiesta, allora si può fare questo è necessario aggiungere più durata del timeout in web.config

<system.web> 
     <httpruntime executionTimeout="4800"/> //or higher values 
    </system.web> 
+0

Il codice è aggiornato nella descrizione della domanda. Se aumentiamo il tempo di esecuzione, aumenterà solo la capacità di ricevere risposta, ma non risolverà il problema di prestazioni. –