Scarica l'esempio (VB.NET e C#)
Lo scopo di questo articolo sarà quello di far aprire dentro Internet Explorer, un'istanza di Excel, che sia in grado di visualizzare il nostro report generato al volo da una pagina ASP.NET, dando la possibilità all'utente di salvarlo localmente sul suo pc in formato ".xls".
Andiamo subito a creare il nostro progetto web ASP.NET, che potete scaricare come esempio allegato a questo articolo. Abbiamo bisogno di 2 pagine:
- Default.aspx, che conterrà semplicemente un link alla pagina che genererà il report in excel;
- ExcelResponse.aspx, che si occuperà di generare e visualizzare il report sul browser.
Tralasciamo la Default.aspx, la quale conterrà semplicemente un <a href="ExcelResponse.aspx">, e soffermiamoci sulla ExcelResponse.aspx.
Questa pagina vi sembrerà un po' anomala, perché nel file di layout (ExcelResponse.aspx), dove di solito si trova l'html, troverete soltanto la direttiva page che indica la classe di Code-Behind da utilizzare.
Sì, proprio così. Infatti tutto quello che ExcelResponse.aspx manderà al client come risposta sarà impostato da code-behind, e cioè nel file ExcelResponse.aspx.cs. Vediamone subito il codice allora, che si trova tutto nel gestore di evento "Page_Load".
La creazione della DataGrid
All'inizio della routine vediamo subito questa istruzione:
// Creo manualmente l'istanza del controllo DataGrid
DataGrid grid = new DataGrid();
In questo modo stiamo creando manualmente un'istanza della classe DataGrid, che andremo ad utilizzare per generare la griglia del nostro report. E' necessario crearne un'istanza utilizzando "new" perché, diversamente da come avviene di solito, stiamo usando il controllo solo da codice di code-behind e non inserendo il tag nell'HTML, che permetterebbe al parser di pagine ASP.NET di crearne al volo un'istanza.
A questo punto possiamo personalizzare l'aspetto della griglia, impostandone le varie proprietà grafiche:
// chiamo la routine che imposta alcune proprietà di visualizzazione della griglia
SetGridLayout(ref grid);
...
private void SetGridLayout(ref DataGrid grid)
{
grid.ShowHeader = true ;
grid.HeaderStyle.BackColor = System.Drawing.Color.Red;
grid.HeaderStyle.ForeColor = System.Drawing.Color.White;
grid.HeaderStyle.Font.Bold = true ;
grid.AlternatingItemStyle.BackColor = System.Drawing.Color.Yellow;
}
Io ne ho usate solo alcune, ma voi potrete sbizzarrirvi quanto volete, per impostare font, backgound color, e quant'altro, secondo i vostri gusti (ma anche secondo quelli del vostro cliente !!! ;-) )
Adesso creiamo la sorgente dati per il report:
// chiamo la routine ch emi restituisce una datatable da usare come sorgente dei dati per il report
DataTable dt = CreateDataSource();
// 1) imposto la sorgente dei dati per la griglia
grid.DataSource = dt;
grid.DataBind();
Come potete notare dal pezzo di codice riportato sopra, mi avvalgo di una mia funzioncina che mi restituisce una DataTable riempita con i miei dati, da passare alla proprietà DataSource della DataGrid.
Dopodichè richiamo il metodo DataBind(), che indica semplimente all'oggetto DataGrid di creare in memoria la sua struttura di griglia in base alla sorgente dati che gli è stata passata.
La generazione del report in formato Excel
Prima di andare avanti, è necessario illustrare una piccola feature di MS Excel, che probabilmente non tutti conoscono. Selezionando e copiando da una pagina web dei dati rappresentati in una tabella, ed incollando su un foglio di Excel, quest'ultimo è in grado di interpretare la struttura tabellare dell'html copiato, riportando i dati nelle celle del foglio elettronico.
Questa funzionalità si rivelerà molto utile nel nostro caso, e capiremo subito il perché.
Una volta pronta in memoria la griglia sotto forma di oggetto DataGrid, non ci resta altro da fare che cercare di ottenerne l'HTML rappresentante la tabella con i nostri dati, e quindi mandarlo al browser, indicando a quest'ultimo di girare i dati in arrivo ad una istanza di MS Excel integrata in Explorer stesso.
Vediamo tutto questo tradotto in codice.
// 2) imposto il tipo di ContentType e la codifica per il Response
Response.Clear();
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Allora, per prima cosa si pulisce il buffer per la response, per essere certi di mandare al browser solo quello che andremo ad impostare da questa linea in giù, tramite delle Response.Write.
Poi viene impostato il ContentType della risposta su "application/vnd.ms-excel". E' proprio questa la linea di codice più importante, in quanto indica al browser che la risposta che sta ricevendo dal server deve demandarla ad una istanza di Excel, che Explorer apre all'interno della finestra corrente.
Tale istanza di Excel si occuperà di "parserizzare" lo stream HTML che gli arriverà, e di trasformarlo in foglio elettronico, grazie alla sua feature descritta sopra.
Adesso dobbiamo semplicemente dire alla DataGrid di renderizzarsi e di restituirci il suo HTML, da spedire al client tramite Response.write.
// 3) creo l'HtmlTextWriter su cui renderizzo la griglia
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
grid.RenderControl(hw);
// 4) ottiene la stringa HTML dallo stream, e lo manda al browser, per essere intrpretato da Excel
string str_tw = tw.ToString();
Response.Write(str_tw);
Response.Flush();
Response.Close();
Per fare questo è necessario istanziare un HtmlTextWriter, da passare al metodo RenderControl della DataGrid (metodo che è ereditato dalla classe Control, la classe base per tutti i controlli ASP.NET). Questo metodo indica all'oggetto DataGrid, di renderizzare l'output della griglia vera e propria dentro l'HtmlTextWriter, del quale si può richiamare a sua volta il metodo ToString() per ottenerne finalmente la stringa HTML da inviare al client tramite Response.Write.
Ed ecco il risultato sul browser di tutto questo giochetto:

Da questo punto in poi l'utente può tranquillamente decidere di salvare il report sul suo pc, semplicemente andando su File -> Salva con nome.
Da notare che gli verrà proposto di salvare sia come pagina Web, sia come Cartella di lavoro di MS Excel:

Conclusioni
Abbiamo visto quindi che con poche righe di codice possiamo sfruttare dati provenienti da qualsiasi sorgente per generare facilmente dei report in Excel al volo, grazie alla potenza di DataSet, DataTable e DataGrid. Ovviamente il mio è solo un semplice esempio per far capire cosa si può fare, lascio a voi il piacere di provare a sviluppare soluzioni più complesse e più utili rispetto ad un report sulla mia rubrica degli indirizzi ;-)
posted on venerdì 8 luglio 2005 6.47
by
Stefano Giannone