わかりました、これは興味深い問題です。私は、既存の VB プロジェクトの変更を任されています。現在、ユーザーは一連のドロップダウンから選択して、SQL クエリを選択し、そのクエリを実行しています。したがって、ユーザーが環境ドロップダウンを選択すると、そのドロップダウンの結果がカテゴリ ドロップダウンに取り込まれます。カテゴリを選択すると、使用可能なクエリのドロップダウンが表示されます。クエリを選択して [実行] ボタンをクリックすると、クエリの結果がグリッドビューに表示されます。クエリ結果の一部は巨大です。テストとして実行しているクエリには、40 列と 20,000 レコードがあります。クエリは 5 秒未満で実行されますが、グリッドビューのレンダリングには 1 分以上かかります。グリッドビューのレンダリングが完了すると、ユーザーは結果を Excel にエクスポートするオプションを利用できます。これは、コードが gridview を介して Excel のインスタンスを開くことを意味します。RenderControl を実行し、結果を Excel に表示します。ユーザーは、Excel ファイルを保存してからファイルに移動することを望んでおらず、使用している Web フォームから直接開くことを望んでいます。これは、コードが現在行っていることです。
ただし、ユーザーはグリッドビューを気にしません。彼らはそれを見ても気にしません。彼らはただ Excel を開きたいだけです。したがって、gridview.RenderControl を使用する代わりに、Excel を開いてメモリ内の DataTable (または DataSet) を設定します。それを行うための最良の方法について何か考えはありますか?
Dim MyConnection As SqlConnection Dim MyCommand As SqlCommand Dim MyDataTable As DataTable Dim MyReader As SqlDataReader
MyConnection = New SqlConnection()
MyConnection.ConnectionString = ConfigurationManager.ConnectionStrings(Connection).ConnectionString
MyCommand = New SqlCommand()
MyCommand.CommandText = Sqlquery
MyCommand.CommandType = CommandType.Text
MyCommand.Connection = MyConnection
MyCommand.Connection.Open()
MyReader = MyCommand.ExecuteReader(CommandBehavior.CloseConnection)
MyDataTable = New DataTable()
MyDataTable.Load(MyReader)
If (MyDataTable.Rows.Count > 0) Then
QueryresultPanel.Visible = True
gvLineItems.DataSource = MyDataTable
gvLineItems.DataBind()
End If
MyDataTable.Dispose()
MyCommand.Dispose()
MyConnection.Dispose()
Excel のインスタンスを開いて設定する方法は次のとおりです。
Protected Sub btnExportToExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExportToExcel.Click
Response.Clear()
Response.Buffer = True
'
' Set the content type to Excel.
'
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls")
Response.Charset = ""
Response.ContentType = "application/vnd.ms-excel"
'
' Turn off the view state.
'
Me.EnableViewState = False
Dim oStringWriter As New System.IO.StringWriter()
Dim oHtmlTextWriter As New System.Web.UI.HtmlTextWriter(oStringWriter)
'
' Get the HTML for the control.
'
gvLineItems.RenderControl(oHtmlTextWriter)
'
' Write the HTML back to the browser.
'
Response.Write(oStringWriter.ToString())
Response.[End]()
End Sub
明らかに、DataTable または DataSet 用の RenderControl はなく、このレコード セットを取得して Excel のインスタンスでレンダリングする方法を最初にファイルに保存しないとわかりません。