Esportare DataSet in Excel

Mattepuffo's logo
Esportare DataSet in Excel

Esportare DataSet in Excel

In un altro articolo ho spiegato come esportare una DataGridView in Excel.

Adesso vediamo come esportare un DataSet direttamente, in modo da renderlo indipendente dal componente dove visualiziamo i dati.

In questo caso, infatti, i dati vengono poi rappresentati su una pagina Asp.NET e il plugin jQuery DataTable, il che rende impossibile esportare i dati direttamente dal componente.

Dobbiamo quindi estrarli direttamente da un DataSet.

Prima di tutto dobbiamo avere un metodo che esegue la connessione e la query; tipo questo:

        public DataSet getSomething()
        {
            connection().Open();
            OdbcCommand cmd = new OdbcCommand();
            OdbcDataAdapter adapter = new OdbcDataAdapter();
            DataSet ds = new DataSet();
            cmd.CommandText = "SELECT * FROM somewhere";
            cmd.Connection = conn;
            adapter.SelectCommand = cmd;
            adapter.Fill(ds);
            ds.Dispose();
            conn.Close();
            return ds;
        }

Semplicemente ritorna un DataSet.

Poi dentro la pagina mettiamo un controllo server di tipo DataGrid impostando i colori e tutto il resto:

   <asp:DataGrid ID="grid" runat="server" GridLines="Both" CellPadding="1" BackColor="White"
        BorderColor="#999999" BorderWidth="1px" BorderStyle="None">
        <EditItemStyle BackColor="White" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px"
            ForeColor="Black" />
        <HeaderStyle BackColor="#CC3300" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px"
            HorizontalAlign="Center" />
        <ItemStyle BackColor="White" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px"
            ForeColor="Black" />
        <SelectedItemStyle BackColor="White" BorderColor="Black" BorderStyle="Solid" BorderWidth="1px"
            ForeColor="Black" />
    </asp:DataGrid>

Lo stile che scegliamo sarà quello visualizzato nel foglio Excel.

Infine la parte di code-behind; io ho impostato un evento su un Button:

        protected void export_Click(object sender, EventArgs e)
        {

            Dbmanager db = new Dbmanager(); // CLASSE PER LA CONNESSIONE
            string nomeFile = "file.xls";
            DataTable dt = db.getSomething().Tables[0];
            if (dt.Rows.Count > 0)
            {
                System.IO.StringWriter sw = new System.IO.StringWriter();
                HtmlTextWriter hw = new HtmlTextWriter(sw);
                HtmlForm frm = new HtmlForm();
                grid.DataSource = dt;
                grid.DataBind();
                grid.RenderControl(hw);
                Response.ContentType = "application/vnd.ms-excel";
                Response.AddHeader("content-disposition", "attachment;filename=" + nomeFile + "");
                Response.Charset = "UTF-8";
                EnableViewState = false;
                Response.Write(sw.ToString());
                Response.End();
            }
        }

Creiamo un oggetto DataTable riferito al nostro DataSet (che viene dal metodo getSomething()).

Se ci sono righe facciamo le varie operazioni.

Impostiamo il source della nostra DataGrid; poi eseguiamo le operazioni di esportazione e forziamo il download del file.


Condividi

Commentami!