0

過去 2 日間、血まみれのデータを取得して 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>

コードビハインド

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
4

2 に答える 2

7
  1. 先頭に a がありません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

ここここを参照してください。

編集: を使用していることを確認しただけですUpdatePanelPostBackTriggerそのボタンの (Full-) を作成したことを確認してください。

<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 ファイルを作成し、それを Response に書き込むのと同じくらい簡単です。

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

于 2012-08-31T21:23:40.530 に答える
0

私の解決策は、次の手順に従うことです。

ステップ1(デザインページ内)

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 ドキュメントがダウンロードされます。

于 2013-04-08T11:16:57.073 に答える