【问题标题】:Export GridView to Excel (not working)将 GridView 导出到 Excel(不工作)
【发布时间】:2012-08-31 21:21:23
【问题描述】:

过去两天我一直在尝试获取一些血腥数据以导出到 Excel。经过大量研究,我确定最好和最常见的方法是使用HttpResponse 标头,如下面的代码所示。在调试模式下经历无数次之后,我已经确认数据确实在那里,并且按照我想要的方式过滤和排序。但是,它不会以 Excel 文件的形式下载,也不会为此做任何事情。

我怀疑这可能与我的UpdatePanelImageButton 未正确回帖有关,但我不确定。我究竟做错了什么?请帮我调试这个问题。我将永远感激不尽。谢谢你。 :)

标记

<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>

代码隐藏

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

【问题讨论】:

    标签: asp.net vb.net gridview updatepanel export-to-excel


    【解决方案1】:
    1. 我在开头缺少Response.Clear
    2. 您正在调用GridView.RenderControl(htmlTextWriter),因此该页面引发了服务器控件在表单之外呈现的异常。尝试在调试器中执行它,我很确定您会看到该异常。

    你可以通过覆盖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
    

    参见herehere

    编辑:我刚刚看到您使用的是UpdatePanel。确保您为该按钮创建了一个 (Full-)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>
    

    但我不会创建一个可以由 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()
    

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

    【讨论】:

    • 嗨,蒂姆,我也尝试过 1 和 2,但仍然没有。我还进行了调试,没有错误,或者它们被吞没了。这让我发疯。不应该这么难。 :( 感谢关于库的提示,如果我仍然无法使其正常工作,我会尝试一下,但如果可以避免的话,我真的不想再学习另一个库或插件。
    • 是的,这就是为什么我发布我的标记以显示 UpdatePanel 并在我的问题中提到它,哈哈。按下按钮时如何强制进行完整的回发?我想这样做,但没有按钮具有 AutoPostBack 属性。 :(
    • 我已经展示了如何仅使用PostBackTrigger 强制对下载按钮进行完整回发。 AutoPostBack 不需要,因为按钮(或 ImageButton)会自动回发。
    • 天哪!!!那解决了它。它必须是 PostBackTriggerAsyncPostBackTrigger。诅咒你更新面板!!!你会不会给我带来无穷无尽的麻烦!!啊!!!非常感谢蒂姆,你又救了我。 ^.~(大家点赞这个答案,肯定能帮到别人)。
    【解决方案2】:

    我的解决方案是按照以下步骤操作:

    第 1 步(在设计页面中)

    "%@ Page" 中设置EnableEventValidation ="false"

    <%@ Page Title="" Language="VB" MasterPageFile="~/Aroghyam.master" EnableEventValidation ="false" AutoEventWireup="false" CodeFile="Search_IncidentStatus.aspx.vb" Inherits="Search_IncidentStatus" %>
    

    第 2 步(在设计页面中)

    如果有更新面板,则添加一个导出按钮,单击该按钮时会将网格数据导出为 Excel 格式asp:PostBackTrigger(不要放在asp:AsyncPostBackTrigger

    `<asp:PostBackTrigger ControlID="btnExportToExcel" />`
    

    第 3 步(在代码中)

    添加以下内容:

    Public Overloads Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    
        ' no implementation necessary,used just to handle error (just paste this to your       code)
    End Sub
    

    第 4 步(在代码中)

    生成 Excel 内容:

    '-------------------GETTING THE DATATABLE------------------
    Dim searchResultTable as new Datatable = // GET TABLE FROM DATABASE
    '----------------------------------------------------------
    
    '-------------------ASSIGNING TABLE TO GRID----------------
    GvIncidentStatus.DataSource = SearchResultTable
    GvIncidentStatus.DataBind()
    
    '-----------------CODE FOR GENERATION TO EXCEL
    Response.Clear()
    GvIncidentStatus.AllowPaging = False
    Response.Buffer = True
    Me.EnableViewState = False
    Response.AddHeader("content-disposition", String.Format("attachment;filename=MyExcelfile.xls"))
    Response.Charset = ""
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    Dim sw As New StringWriter()
    Dim hw As New HtmlTextWriter(sw)
    GvIncidentStatus.RenderControl(hw)
    Response.Output.Write(sw.ToString())
    Response.End()
    '-----------------
    

    现在单击导出按钮将下载 Excel 文档。

    【讨论】:

    • 啊……别喊了!或者换句话说:请删除所有大写的 cmets,它们太难阅读了。在编辑时,请清理代码的格式混乱
    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多