2012-08-31 114 views
0

我花了最近兩天試圖獲得一些血腥的數據導出到Excel。經過大量研究,我確定最好和最常用的方法是使用HttpResponse標題,如下面的代碼所示。在調試模式下經歷了無數次之後,我已經確認數據實際上存在並且按照我想要的方式進行過濾和排序。但是,它不會以Excel文件的形式下載,也不會爲此做任何事情。將GridView導出到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 

回答

5
  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。請確保您已經創建了一個(全雙工)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表,我會用Excel的圖書館像EPPlus(GPL)我可以熱烈推薦。

然後,它是那麼容易,因爲這從一個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

+0

嗨蒂姆,我已經嘗試過1&2以及,但仍然沒有。我也加入了調試和沒有錯誤,或者他們正在被吞噬。這讓我瘋狂。這不應該是這麼難。 :(感謝圖書館的提示,如果我仍然無法完成這項工作,我會試一試,但如果可以避免的話,我真的不想再學習另一個圖書館或插件。 – Chiramisu

+0

是的,這就是爲什麼我發佈了我的標記來顯示'UpdatePanel',並在我的問題中提到它,lol。當按下按鈕時,我怎麼強制完整回發?我想這樣做,但沒有按鈕具有'AutoPostBack'屬性。 :( – Chiramisu

+1

我已經展示瞭如何使用'PostBackTrigger'來強制下載按鈕的完整回發。由於一個buton(或ImageButton)會自動回傳,因此不需要AutoPostBack。 –

0

我的解決辦法是請按照下列步驟:

步驟1(在設計頁)

SET EnableEventValidation ="false""%@ Page"

<%@ 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文件。

+3

ahhh ... STOP他們咆哮!換句話說:請刪除所有上限評論,他們太難以閱讀。在編輯時,請清理代碼的格式化內容 – kleopatra