Na parte anterior do artigo, criamos o método que fará a exportação do GridView, Poderíamos parar por ali mas existe a possibilidade de o GridView conter TemplateFields, contendo WebControls. Para essa situação, deveremos criar um método que substitui esses TemplateFields com WebControls por textos contidos nos próprios WebControls.


private static void PrepareGridViewForExport(Control gv)
    {
        LinkButton lb = new LinkButton();
        Literal l = new Literal();
        string name = String.Empty;
        for (int i = 0; i < gv.Controls.Count; i++)
        {
            if (gv.Controls[i].GetType() == typeof(LinkButton))
            {
                l.Text = (gv.Controls[i] as LinkButton).Text;
                gv.Controls.Remove(gv.Controls[i]);
                gv.Controls.AddAt(i, l);
            }
            else if (gv.Controls[i].GetType() == typeof(DropDownList))
            {
                l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;
                gv.Controls.Remove(gv.Controls[i]);
                gv.Controls.AddAt(i, l);
            }
            else if (gv.Controls[i].GetType() == typeof(ImageButton))
            {
                l.Text = (gv.Controls[i] as ImageButton).ToolTip;
                gv.Controls.Remove(gv.Controls[i]);
                gv.Controls.AddAt(i, l);
            }
            else if (gv.Controls[i].GetType() == typeof(Button) ||
                     gv.Controls[i].GetType() == typeof(HiddenField) ||
                     gv.Controls[i].GetType() == typeof(CheckBox))
            {
                gv.Controls.Remove(gv.Controls[i]);
            }
            if (gv.Controls[i].HasControls())
            {
                PrepareGridViewForExport(gv.Controls[i]);
            }
        }
    }


 

Aqui criamos uma função recursiva que lê  todos os controles de um GridView. Uma vez detectado um controle, é verificado seu tipo para poder ler seu conteúdo e jogar num controle Literal, que é colocado no logar do WebControl.

 

Pronto, com esse método, podemos criar um método público que fará a exportação do gridView:


public static void ExportGridView(FileType pType, string pFileName, GridView pGrid)
    {

        pGrid.AllowPaging = false;
        pGrid.GridLines = GridLines.Both;
        PrepareGridViewForExport(pGrid);
        ExportGrid(pGrid, pType, pFileName);
    }


 

    

A única observação a ser feita em relação a esse método é que ele retira a paginação do GridView, pois precisamos exportar todo o conteúdo do Grid.

 

Com nossa classe pronta, podemos codificar o evento do botão contido na página Default.aspx:

 


protected void btnExport_Click(object sender, EventArgs e)
    {
        Exporter.ExportGridView(Exporter.FileType.Excel, "teste", this.GridView1);
    }


 

O leitor poderá testar a aplicação exportando para Word e Excel. Vale ressaltar que é mantida a formatação do Grid:





 

Com o resultado da exportação, terminamos nosso artigo.

 

Espero que seja útil.

 

Um grande abraço a todos!