Pergunta

O que é a melhor maneira para exportar um gridview em uma planilha do Excel? Isso parece fácil

exceto que meu GridView não tem um atributo de exportação. Qual é a maneira mais rápida de fazer isso?

Foi útil?

Solução

Em uma exportação para excel Escrever este código em btnexporttoExcel evento Click.

    string attachment = "attachment; filename=Export.xls";

    Response.ClearContent();

    Response.AddHeader("content-disposition", attachment);

    Response.ContentType = "application/ms-excel";

    StringWriter sw = new StringWriter();

    HtmlTextWriter htw = new HtmlTextWriter(sw);

    // Create a form to contain the grid

    HtmlForm frm = new HtmlForm();

   gv.Parent.Controls.Add(frm);

    frm.Attributes["runat"] = "server";

    frm.Controls.Add(gv);

    frm.RenderControl(htw);



    //GridView1.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();

Outras dicas

Provavelmente há algo lá fora para isso, mas se você quiser fazê-lo sozinho, você poderia apenas escrever algum código que anda a coleção GridView.Rows, e depois o interior coleção GridViewRow.Cells disso.

Deve ser muito fácil de construir um arquivo CSV a partir daí, e Excel poderia lê-lo sem problema.

Os arquivos CSV são apenas arquivos de texto com valores dentro de aspas, separados por vírgulas. Como esta:

"value", "value", "value"
"value", "value", "value"

Você pode simplesmente pop Notepad uma aberta e construção com a mão para experimentá-lo.

Já fiz isso várias vezes. Excel tem uma versão XML. Ele acaba com a extensão .xml, mas você pode apenas mudar a extensão do arquivo para .xls e o arquivo XML formatado será aberto no excel muito bem.

O maior obstáculo dessa abordagem é o formato Excel XML. Eu costumo criar um arquivo do Excel no Excel no formato aproximado que eu desejo. Eu, então, salvar o arquivo do Excel para o formato XML, e abri-lo em um editor de texto.

Eu costumo criar um arquivo de modelo desta página amostra Excel. Então, quando eu estou exportar as informações no Gridview, eu só tenho que criar o XML para a seção que contém as células que planejam povoar, eu só preceder, e anexar o texto já no arquivo de modelo.

Uma vez que você abrir o arquivo excel xml formatado, você vai descobrir o XML necessária de forma relativamente fácil. A parte mais difícil de entender é a forma como as células referenciar as opções de formatação, que estão no topo do arquivo XML.

Boa sorte, deixe-me saber se você precisar de mais esclarecimentos.

Editar: Você só precisará criar o arquivo excel modelo de uma vez, apenas para obter uma sensação para o xml necessária que você precisa para gerar. Depois de gerar o XML usar o seguinte código para enviá-lo para o usuário:

string fileName = "ExportedFile.xls";
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/xml";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID);
Response.End();



public static void ExportToExcel(Stream outputStream)
{
    XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default);

    //ExcelHeaderString and ExcelStylesString are from the template
    xmlSink.WriteRaw(ExcelHeaderString);
    xmlSink.WriteRaw(ExcelStylesString);

    //write your elements here
    xmlSink.WriteElement("YourElements");

    //ExcelFooterString is from the template
    xmlSink.WriteRaw(ExcelFooterString);
}

Este biblioteca para .net tem funcionado muito bem para os nossos casos de uso.

Esta biblioteca permite gerar Excel pastas de trabalho usando XML, é construído de 100% em C # e não requer Excel instalado em tudo para gerar os arquivos. Ela expõe um modelo de objeto simples para gerar as pastas de trabalho XML.

Não há nenhuma integração incorporada com um controle GridView, mas escrever um adaptador genérico é bastante fácil e seria reutilizável em outros projetos.

Este método vai direto para o formato Excel sem a necessidade de XML ser instalado no servidor ou usando XML.

        Protected Sub ExportToExcel()

        Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1")
        If Not gv1 Is Nothing Then
            Response.ClearHeaders()
            Response.ClearContent()

            ' Set the content type to Excel
            Response.ContentType = "application/vnd.ms-excel"

            ' make it open the save as dialog
            Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls")

            'Turn off the view state 
            Me.EnableViewState = False

            'Remove the charset from the Content-Type header 
            Response.Charset = String.Empty

            Dim myTextWriter As New System.IO.StringWriter
            Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter)
            Dim frm As HtmlForm = New HtmlForm()
            Controls.Add(frm)
            frm.Controls.Add(gv1)

            'Get the HTML for the control 
            frm.RenderControl(myHtmlTextWriter)

            'Write the HTML to the browser 
            Response.Write(myTextWriter.ToString())
            'End the response 
            Response.End()
        End If
    End Sub

Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control
    If root.ID = id Then
        Return root
    End If
    Dim c As Control
    For Each c In root.Controls
        Dim t As Control = FindControlRecursive(c, id)
        If Not t Is Nothing Then
            Return t
        End If
    Next
    Return Nothing
End Function

Eu costumava CarlosAg.ExcelXmlWriter ligação .

Eu loop através de todos GridViews HeaderCells e, em seguida, através de todas as linhas. A única coisa é que se você permitir paginação e você tem mais de uma página você tem que definir o PageSize para um valor alto (I ajustado para 10 milhões), então DataBind o GridView novamente e fazer o seu trabalho. Depois definir o valor antigo PageSize volta. Se alguém sabe uma solução melhor, você é bem-vindo.

EDIT:. O try / catch está lá porque, por algum motivo, não é possível verificar o tipo de controle e, em seguida, lançar a etiqueta ou LinkButton ==> control.GetType()

Aqui está o meu código.

 public static Workbook CreateWorkbook(GridView gridView)
    {
        int pageSize = gridView.PageSize;
        gridView.PageSize = 10000000;
        gridView.DataBind();

        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets.Add("Export");

        WorksheetStyle style = workbook.Styles.Add("headerStyle");
        style.Font.Bold = true;
        style = workbook.Styles.Add("defaultStyle");
        style.Alignment.WrapText = true;
        style = workbook.Styles.Add("infoStyle");
        style.Font.Color = "Red";
        style.Font.Bold = true;

        sheet.Table.Rows.Add(new WorksheetRow());

        WorksheetRow headerRow = new WorksheetRow();
        foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells)
        {
            if (!string.IsNullOrEmpty(cell.Text))
                headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle");
            else
                foreach (Control control in cell.Controls)
                {
                    LinkButton linkButton = new LinkButton();
                    try
                    {
                        linkButton = (LinkButton)control;
                    }
                    catch { }

                    if (!string.IsNullOrEmpty(linkButton.Text))
                        headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle");
                    else
                    {
                        Label label = new Label();
                        try
                        {
                            label = (Label)control;
                        }
                        catch { }
                        if (!string.IsNullOrEmpty(label.Text))
                            headerRow.Cells.Add(label.Text, DataType.String, "headerStyle");
                    }
                }
        }

        sheet.Table.Rows.Add(headerRow);

        foreach (GridViewRow row in gridView.Rows)
        {
            WorksheetRow wrow = new WorksheetRow();
            foreach (TableCell cell in row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    if (control.GetType() == typeof(Label))
                    {
                        wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle");
                    }
                }
            }
            sheet.Table.Rows.Add(wrow);
        }

        gridView.PageSize = pageSize;

        return workbook;
    }
Private exportToExcel As Boolean = False

Private Sub LoadInExcel()
    Me.Response.ClearContent()
    Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls")
    Me.Response.ContentType = "application/ms-excel"
    Dim sw1 As New IO.StringWriter
    Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1)
    GridView1.RenderControl(htw1)
    Response.Write(sw1.ToString())
    Response.End()
End Sub

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' Confirms that an HtmlForm control is rendered for the specified ASP.NET
    ' server control at run time.
End Sub

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    If exportToExcel Then
        LoadInExcel()
    End If

    MyBase.Render(writer)
End Sub

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    exportToExcel = True
End Sub

Você deve ter excel instalado e referenciar bibliotecas do Escritório de interoperabilidade no seu projeto. Adicionar:

As importações Microsoft.Office.Core, Importações Microsoft.Office.Interop

A solução acima leva o gridview e puxa o html fora dele. Em seguida, escreve-o em excel. O html proveniente da rede vai incluir atributos de estilo, como preenchimento e cor. Ele também irá fazer títulos de colunas classificáveis ??olhar como links. Quando eu usei isso eu escrevi um analisador personalizado para retirar todos os estilos indesejados fora para me dar apenas os dados brutos. Vou deixar essa tarefa cabe a você uma vez que é específico para cada grade.

É muito importante que você incluir a substituição para VerifyRenderingInServerForm, mesmo que não há qualquer dentro do código do mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top