Esportare un gridview in Word, tramite un linkbutton nel footer

Articolo che illustra una tecnica per esportare il controllo gridView in Word.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori


Introduzione

In questo articolo, vedremo come esportare un controllo gridview in Microsoft Word 2007, tramite la tecnologia Asp.Net 3.5.
La gridView, sarà dotato di un pulsante nel footer (Figura 1)  di tipo linkbutton, il quale avrà il compito di esportare la griglia in formato Microsoft Word.


Figura 1

Predisposizione della pagina

Dopo aver selezionato nuovo progetto web, da Visual Studio 2008, entriamo nella parte sorgente html della pagina web, in alto nell'intestazione inseriamo il seguente parametro alla pagina.

EnableEventValidation="false"


Terminato ciò, passiamo in visualizzazione designer, ed inseriamo un controllo gridiview, il controllo gridview avrà due colonne, nella prima verrà visualizzata la descrizione di un determinato prodotto, mentre nella seconda colonna, l'importo di tale prodotto. Dopo aver impostato la proprietà showfooter a true del controllo gridview, passiamo in visualizzazione codice html, per personalizzare le colonne della griglia.
La colonna Descrizione, sarà di tipo template field, mentre la colonna  è di tipo classica, ossia boundfield.
Di seguito si riporta il frammento di codice della griglia.

  <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
        CellPadding="4" ForeColor="#333333" GridLines="None" ShowFooter="True">
        <RowStyle BackColor="#EFF3FB" />
        <Columns>
            <asp:TemplateField HeaderText="Descrizione">
                <ItemTemplate>
                    <asp:Label ID="lblDescrizione" runat="server" Text='<%# Eval("Descrizione") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:LinkButton ID="lnkWord" runat="server" OnClick="LnkEsportaWord_Click"
                        Text="Esporta Word"></asp:LinkButton>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Importo" HeaderText="Importo" />
        </Columns>
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <EditRowStyle BackColor="#2461BF" />
        <AlternatingRowStyle BackColor="White" />
    </asp:GridView>


Come si vede dal codice html precedente, abbiamo una colonna di tipo templateField, nella quale si trova un altro oggetto di tipo itemTemplate, al cui interno, un oggetto di tipo label.
La proprietà Text, ossia la visualizzazione del testo, viene impostato tramite Eval(“Descrizione”) che è il nome della colonna della fonte dati a cui sarà associato il controllo GridView.
Sempre per la templetaField, si noti un altro oggetto di tipo FooterTemplate, in questo modo, possiamo personalizzare il footer con i controlli di sono gradimento, in questo caso con il controllo linkbutton. Nell'attributo onClick dell'oggetto linkbutton, viene impostato la funzione evento di tale controllo, in questo modo quando viene fatto click su tale controllo sarà eseguito la funzione a cui fa riferimento
La colonna successiva, è di tipo boundfield.

Stesura di codice.

Terminata la progettazione della nostra pagina web, ora non ci resta che scrivere il codice per esportare la griglia in formato Microsoft Word.
Nel load della Form, inseriamo il seguente codice, per il caricamento della griglia.

VB.Net

Dim dttDati As New DataTable
        Dim dtcDescrizione As New DataColumn("Descrizione")
        Dim dtcImporto As New DataColumn("Importo")
        dttDati.Columns.Add(dtcDescrizione)
        dttDati.Columns.Add(dtcImporto)
        Dim dtrRiga As DataRow = dttDati.NewRow()
        dtrRiga("Descrizione") = "Hard Disk"
        dtrRiga("Importo") = 100.3
        dttDati.Rows.Add(dtrRiga)
        dtrRiga = dttDati.NewRow()
        dtrRiga("Descrizione") = "Mouse"
        dtrRiga("Importo") = 10.4
        dttDati.Rows.Add(dtrRiga)
        dtrRiga = dttDati.NewRow()
        dtrRiga("Descrizione") = "Crediti precedenti"
        dtrRiga("Importo") = -5.2
        dttDati.Rows.Add(dtrRiga)
        GridView1.DataSource = dttDati
        GridView1.DataBind()

C#

DataTable dttDati = new DataTable();
            DataColumn dtcDescrizione = new DataColumn("Descrizione");
            DataColumn dtcImporto = new DataColumn("Importo");
            dttDati.Columns.Add(dtcDescrizione);
            dttDati.Columns.Add(dtcImporto);
            DataRow dtrRiga = dttDati.NewRow();
            dtrRiga["Descrizione"] = "Hard Disk";
            dtrRiga["Importo"] = 100.3;
            dttDati.Rows.Add(dtrRiga);
            dtrRiga = dttDati.NewRow();
            dtrRiga["Descrizione"] = "Mouse";
            dtrRiga["Importo"] = 10.4;
            dttDati.Rows.Add(dtrRiga);
            dtrRiga = dttDati.NewRow();
            dtrRiga["Descrizione"] = "Crediti precedenti";
            dtrRiga["Importo"] = -5.2;
            dttDati.Rows.Add(dtrRiga);
            GridView1.DataSource = dttDati;
            GridView1.DataBind();

Ora non ci resta che creare la funzione che viene avvita al click del controllo linkbutton, il codice riportato qui di seguito, tramite gli oggetti stringWriter e htmlTextWriter, trasforma il contenuto html in uno streaming formato Microsoft Excel, dopo aver impostato il tipo di contenuto ed il nome del file.


VB.Net

  Protected Sub LnkEsportaWord_Click(ByVal sender As Object, ByVal e As EventArgs)
        Response.Clear()
        Response.Buffer = True
        Response.ContentType = "application/ms-word"
        Response.AddHeader("content-disposition", "attachment;filename=NomeFile.doc")
        Response.Charset = ""
        Dim swr As New System.IO.StringWriter()
        Dim htw As New System.Web.UI.HtmlTextWriter(swr)
        GridView1.RenderControl(htw)
        Response.Write(swr.ToString())
        Response.End()
    End Sub


C#

 protected void LnkEsportaWord_Click(Object sender, EventArgs e)
        {
            Response.Clear();
            Response.Buffer = true;
            Response.ContentType = "application/ms-word";
            Response.AddHeader("content-disposition", "attachment;filename=NomeFile.doc");
            Response.Charset = "";
            System.IO.StringWriter swr = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htw = new System.Web.UI.HtmlTextWriter(swr);
            GridView1.RenderControl(htw);
            Response.Write(swr.ToString());
            Response.End();
        }

 

Prima di testare la nostra pagina, dobbiamo creare l'ovverrides dell'evento della verifica del rendering, della pagina, per evitare che si possano verificare problemi.


VB.Net

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)

    End Sub

C#

 public override void VerifyRenderingInServerForm(Control control)
        {
        }

 Non ci resta che eseguire la nostra applicazione, ed fare una prova.

Conclusioni:


L'articolo ha voluto illustrare al lettore, la possibilità di ampliare il controllo gridview, con l'aggiunta di un oggetto di tipo linkbutton, per l'esportazione della griglia in formato Microsoft Word.
La funzionalità di esporta griglia, può tornare utile in diversi contesti.
Tramite la parola download è possibile scaricare il file d'esempio utilizzato in questo articolo.

Download