将GridView导出到Excel(不工作)

Chi*_*isu 0 vb.net asp.net gridview updatepanel export-to-excel

我花了最近两天试图将一些血腥数据导出到Excel.经过大量研究后,我确定最好和最常用的方法是使用HttpResponse标题,如下面的代码所示.在调试模式中经过无数次之后,我已经确认数据实际存在,并且按照我想要的方式进行过滤和排序.但是,它不会作为Excel文件下载,也不会做任何事情.

我怀疑这可能与我UpdatePanel或可能ImageButton没有正确回复有关,但我不确定.我究竟做错了什么?请帮我调试这个问题.我会永远感激.谢谢.:)

标记

<asp:UpdatePanel ID="statusUpdatePanel" runat="server" UpdateMode="Conditional">
<Triggers>
    <asp:AsyncPostBackTrigger ControlID="btnExportXLS" EventName="Click" />
</Triggers>
<ContentTemplate>
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" PageSize="10"
        AllowSorting="True" DataSourceID="GridView1SDS" DataKeyNames="ID">
    </asp:GridView>
    <span><asp:ImageButton ID="btnExportXLS" runat="server" /></span>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)

代码隐藏

Protected Sub ExportToExcel() Handles btnExportXLS.Click
    Dim dt As New DataTable()
    Dim da As New SqlDataAdapter(SelectCommand, ConnectionString)

    da.Fill(dt)

    Dim gv As New GridView()
    gv.DataSource = dt
    gv.DataBind()

    Dim sw As New IO.StringWriter()
    Dim hw As New System.Web.UI.HtmlTextWriter(sw)
    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader("content-disposition", "attachment;filename=Report.xls")
    Response.Charset = String.Empty

    gv.RenderControl(hw)
    Response.Write(sw.ToString()) 'sw is a valid html table, but no Excel file downloads. :(
    Response.End()
End Sub
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 7

  1. Response.Clear在开始的时候错过了一个.
  2. 您正在调用GridView.RenderControl(htmlTextWriter),因此该页面引发了一个异常,即Server-Control是在Form外部呈现的.尝试在调试器中执行它,我很确定你会看到该异常.

您可以通过重写VerifyRenderingInServerForm来避免此异常

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

看到这里这里.

编辑:我刚刚看到你正在使用一个UpdatePanel.确保您已PostBackTrigger为该按钮创建了(完整):

<asp:UpdatePanel ID="UpdGridInfo" runat="server" >
    <ContentTemplate>
        <asp:ImageButton ToolTip="export to Excel" ID="BtnExcelExport" ImageUrl="~/images/excel2007logo.png" runat="server" />
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="BtnExcelExport" />
    </Triggers>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)

但是我没有创建一个可以由excel解释的html表,而是使用像EPPlus(GPL)这样的Excel库,我可以热烈推荐.

然后,从DataTable创建Excel文件并将其写入响应就像这样容易:

Dim pck = New ExcelPackage()
Dim ws = pck.Workbook.Worksheets.Add("Worksheet-Name")
ws.Cells("A1").LoadFromDataTable(dt, True, OfficeOpenXml.Table.TableStyles.Medium1)
Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("content-disposition", "attachment;  filename=ExcelFileName.xlsx")
Response.BinaryWrite(pck.GetAsByteArray())
Response.End()
Run Code Online (Sandbox Code Playgroud)

这是另一个例子:http://epplus.codeplex.com/wikipage?title = WebapplicationExample