Pergunta

Estou tendo problemas com a conversão para o código Excel que estou encontrando. Estou trabalhando em um projeto de site em .NET 4.0 e criei uma classe para isso que faz o seguinte (com base em http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html ):

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition",
string.Format("attachment; filename={0}", fileName)); HttpContext.Current.Response.ContentType = "application/ms-excel"; using (StringWriter sw = new StringWriter()) {
   using (HtmlTextWriter htw = new HtmlTextWriter(sw)) {
    //Create a table to contain the grid
    //Add header row
    //Add each data row
    //Add Footer row
    //Render the table into the htmlwriter
    //  render the htmlwriter into the response
    HttpContext.Current.Response.Write(sw.ToString());
    HttpContext.Current.Response.End();
  }
}

Eu chamo essa classe de um usercontrol que contém um botão que é adicionado a um GridView exibido na página. Isso funciona conforme o esperado - clique no botão e você verá uma opção de download para abrir ou salvar a planilha do Excel resultante contendo os dados do GridView.

No entanto, quando eu chamo isso de um linkbutton dentro de um GridView diferente, gostaria de construir um gridview dinâmico para conter dados e exportá-los. Quando faço isso, recebo uma ThreadAbortException da chamada Response.End na classe.

Pergunta 1: Por que não obtenho a ThreadAbortException ao chamar o mesmo código de dentro de um usercontrol? Os controles de usuário obtêm seus próprios tópicos ou algum outro tipo de contexto?

Pesquisar o erro que recebo quando ocorre ThreadAbortException levou-me a tentar substituí-lo por ApplicationInstance.CompleteRequest (). Quando faço isso, não recebo mais ThreadAbortException, mas isso quebra o controle do usuário que funcionava anteriormente - em vez da planilha do Excel resultante contendo os dados da grade, ela contém o HTML da página que a contém e, de qualquer forma, é fácil de suprimir esse erro com uma captura vazia. No entanto, ele não corrige a chamada direta com o GridView gerado dinamicamente, esse código renderiza um erro de javascript: "A mensagem recebida do servidor não pôde ser analisada."

Eu adoraria entender o que exatamente está acontecendo aqui, mas estou a ponto de precisar de resultados independentemente de compreensão. Todas as outras abordagens que tentei (datagrid em vez de GridView, etc) tiveram os mesmos problemas e são essencialmente as mesmas quando se trata de "assumir o controle" a resposta atual e usando stringwriter e htmlwriter para renderizar os dados em uma resposta com contentType do Excel. E uma vez que isso funciona comprovadamente no contexto de um controle de usuário, estou perdendo o juízo sobre por que não funcionará quando chamado diretamente ...

Foi útil?

Solução 3

Na verdade, o problema não tinha nenhuma relação com a exportação do Excel.O erro “… não pôde ser analisado” era a chave.A partir desses links, obtive a chave: os eventos da grade causam apenas um evento de postback parcial:

http://forums.asp.net/t/1392827.aspx

http://forums.aspfree.com/net-development-11/gridview-footer-template-button-in-updatepanel-not-posting-back-236087.html

Isso explica a ThreadAbortException e o erro “… não foi possível analisar”.Adicionar isso ao OnPreRender do ImageButton foi a solução:

protected void addTrigger_PreRender(object sender, EventArgs e)
{
    if (sender is ImageButton)
    {
        ImageButton imgBtn = (ImageButton)sender;
        ScriptManager ScriptMgr = (ScriptManager)this.FindControl("ScriptManager1");
        ScriptMgr.RegisterPostBackControl(ImgBtn);
    }
}

Outras dicas

Tente em vez disso: HttpApplication.CompleteRequest () conforme: http://www.c6software.com/codesolutions/dotnet/threadabortexception.aspx

Eles discutem o html adicional que está sendo desenvolvido

use isso

   Response.Clear()
    Response.AddHeader("content-disposition", atchment;filename=fm_specification.xls")
    Response.Charset = ""
    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.ContentType = "application/vnd.xls"
    Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter
    Dim htmlwrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)
    GridView1.RenderControl(htmlwrite)
    Response.Write(stringWrite.ToString)
    Response.End()

em vez de gridview1 você pode usar div

                            dont forget to add this on your page

 Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
 End Sub

O evento em que o código Exportar para excel é chamado, deve fazer um postback completo.o problema é porque ele faz apenas um postback parcial.

Eu tive o mesmo erro e ele foi resolvido quando fiz um postback completo.

Espero que isso ajude alguém.

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