Reportistica in ASP.NET con la libreria Spire.DataExport

di Andrea Incerti, in ASP.NET,

Tutti noi, bene o male, abbiamo creato pagine web dove è presente una griglia (per esempio, un controllo GridView) contenente dati provenienti da un database. Peraltro spostare i dati da una griglia in file CSV, XLS o altri formati non è un'operazione così ovvia e rapida come si potrebbe pensare di primo acchito.

Esistono diversi metodi, più o meno utili a seconda di quel che si vuole ottenere. Ad esempio, possiamo leggere le righe di una GridView così come sono presentate a video e trasferirne i dati in un file CSV, ma questo può presentare un problema: se i risultati sono parecchi e la tabella ha il paging attivato, per fare un buon lavoro avremmo bisogno dell'esportazione di tutte le pagine presenti della griglia. Leggere quindi una sola schermata (pagina) non risolverebbe la nostra esigenza.

Per ovviare ai problemi come quello appena descritto, esistono diverse librerie e/o componenti (gratuiti o a pagamento) che permettono di creare reportistica nelle forme più disparate. Alcuni di questi componenti sono poco efficaci, altri hanno costi poco accessibili per giustificare il prezzo dei nostri prodotti. Spire.DataExport Community Edition, versione gratuita della stessa libreria a pagamento, potrebbe fare al caso nostro ed è, infatti, il prodotto che per le sue caratteristiche può essere una valida soluzione per la creazione di report in diversi formati.

Trattandosi di una libreria utilizzabile in vari progetti .NET (quindi non sono in ambito web, ma anche in progetti WinForms, per esempio), vediamo in particolare come poter sfruttare questo prodotto al meglio nelle nostre pagine ASP.NET, elaborando anche i risultati in modo asincrono.

Il progetto che vedremo nel corso dell'articolo è costituito principalmente da due pagine: la prima (Search.aspx) contiene una maschera con i campi di ricerca e il controllo GridView per la visualizzazione dei risultati, la seconda (Download.aspx) crea il report vero e proprio e ne permette il download. Quest'ultima pagina verrà "racchiusa" all'interno di un tag IFRAME creato a runtime e inserito all'interno della pagina di ricerca (Search.aspx).

Utilizzo della libreria Spire.DataExport

Una volta scaricata la libreria dal sito ufficiale, lanciamo l'installer, che va a creare per noi il percorso dove depositare le librerie che ci serviranno nel nostro progetto. Di default viene creato il percorso C:\Programmi\e-iceblue\Spire.DataExport\, all'interno del quale si trova la sottodirectory "bin" e le altre sottocartelle con le librerie compilate per il .NET Framework 2.0, 3.5 e 4.0. Creato il nostro progetto web e installata la libreria, dobbiamo importarla nel progetto stesso, come si fa solitamente con tutte le altre librerie.

Come detto, la libreria Spire.DataExport ci permette di creare report in vari formati, in particolare Excel, HTML, PDF, DBF, CSV e RTF. Nel nostro caso tratteremo l'esportazione di dati in formato CSV ed Excel, a partire da un database SQL Server. Vediamo allora un po' di codice di base (lo completeremo strada facendo) per creare un report di dati in formato CSV.

SqlCommand cmdExport = new SqlCommand();
cmdExport.Connection = "connection string";
cmdExport.CommandText = "report query";
cmdExport.Parameters.AddRange(); // Parametri query

// Creazione oggetto per l'esportazione in CSV 
Spire.DataExport.TXT.TXTExport dataExport = new Spire.DataExport.TXT.TXTExport();
dataExport.ExportType = Spire.DataExport.TXT.TextExportType.CSV;

// ...

dataExport.Columns = this.GetColumns(conn, cmdExport);
dataExport.SQLCommand = cmdExport;

dataExport.SaveToHttpResponse(@"download.csv", Response, Spire.DataExport.Common.SaveType.Attachment);

Le prime righe dell'esempio creano un oggetto di tipo SqlCommand, per il quale sono settate alcune impostazioni di base come la stringa di connessione al database, il comando della query e i relativi parametri.

Di seguito viene istanziato un oggetto di tipo TXTExport, per il quale settiamo diversi parametri (tra cui tipo report, lingua, formato dati, separatore campi, ecc.) che rivedremo più avanti e che comunque sono descritti approfonditamente nella documentazione ufficiale della libreria.

Per creare il report e trasferirlo nella risposta della pagina, usiamo il metodo SaveToHttpResponse con i seguenti parametri:

  • nome del file creato;
  • oggetto di tipo HttpResponse della pagina;
  • content-disposition (abbiamo usato il tipo "Attachment").

La proprietà Columns contiene una lista di tipo StringListCollection, dove ogni singolo elemento è il nome della colonna della tabella da cui vogliamo esportare i dati. Infatti, il metodo GetColumns serve proprio a questo scopo. Eccolo di seguito:

private StringListCollection GetColumns(SqlConnection conn, SqlCommand cmd)
{
  DataTable dt = null;                
  
  try
  {
    using (SqlDataReader result = cmd.ExecuteReader())
    {
      dt = result.GetSchemaTable();
    }
  }
  catch (Exception ex)
  {
    // ...
  }

  StringListCollection colsToExport = new StringListCollection();

  if (dt.Columns.Count > 0)
  {
    foreach (DataRow row in dt.Rows)
    {
      string colName = row["ColumnName"].ToString();
      colsToExport.Add(colName);
    }
  }

  return colsToExport;
}

Il metodo è abbastanza intuitivo: eseguiamo una query sulla tabella da cui vogliamo esportare i dati, leggendone lo schema facendo ricorso a un oggetto DataTable. I nomi delle colonne della tabella in esame li inseriamo nella collection StringListCollection e valorizziamo di conseguenza la proprietà Columns dell'oggetto di tipo TXTExport.

Codice server-side: la pagina Search.aspx

Questa pagina contiene la maschera di ricerca dati e il controllo GridView per la visualizzazione dei risultati. Nell'esempio la maschera di ricerca è costituita da due controlli Label che indicano i campi da ricercare, due controlli TextBox per l'input dei parametri, un bottone che esegue la ricerca, due bottoni per l'esportazione dei risultati in formato CSV o Excel (XLS).

<asp:Label ID="lbName" runat="server" Text= "Name:" />
<asp:TextBox ID="txtName" runat="server"></asp:TextBox> 
<asp:Label ID="lbLastName" runat="server"  Text= "Last name:" />
<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox> 

<asp:UpdatePanel ID="upCerca" runat="server" UpdateMode="Conditional">
  <ContentTemplate>  
    <asp:Button ID="btRicerca" runat="server" CssClass="btRicerca" Text="Cerca" onclick="btRicerca_Click" /> 
  </ContentTemplate>
</asp:UpdatePanel>        

<asp:UpdatePanel ID="upExportButtons" runat="server">
  <ContentTemplate>
    Esporta in:
    <asp:ImageButton ID="btExportCsv" runat="server" ImageUrl="csv.png" ToolTip="Export to CSV" />
    <asp:ImageButton ID="btExportXls" runat="server" ImageUrl="xls.png" ToolTip="Export to XLS" />
    <span id="imgLoaderExport" style="visibility: hidden;">
      <img src="ajax-loader_small.gif" alt="Loader" />          
    </span>
  </ContentTemplate>
</asp:UpdatePanel>

Usiamo due UpdatePanel per eseguire le operazioni in modo asincrono. In particolare, il pannello con ID "upExportButtons" contiene i due buttoni per le esportazioni dei dati (CSV e XLS) e un tag SPAN "imgLoaderExport", impostato inizialmente come invisibile e contenente un'immagine GIF di un loader. Questa immagine la faremo comparire solamente durante la creazione e il caricamento del report, per poi farla scomparire nuovamente a fine elaborazione. Per semplificare, al posto dell'immagine avremmo potuto utilizzare un testo a piacere, come ad esempio "Attendere...".

3 pagine in totale: 1 2 3
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Top Ten Articoli

Articoli via e-mail

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

In primo piano

I più letti di oggi

In evidenza

Misc