好的,这是一个有趣的问题。我的任务是修改现有的 VB 项目。当前,用户从一系列下拉列表中选择一个 sql 查询,然后运行该查询。因此,用户选择和环境下拉列表,该下拉列表的结果将填充类别下拉列表。选择类别后,他们会获得可用查询的下拉列表。一旦他们选择了一个查询并点击“运行”按钮,他们就会得到一个带有查询结果的网格视图。一些查询结果很大。我作为测试运行的查询有 40 列和 20,000 条记录。查询运行时间不到 5 秒,但渲染 gridview 需要一分钟多的时间。一旦 gridview 完成渲染,用户可以选择将结果导出到 Excel。我的意思是代码通过gridview打开一个Excel实例。RenderControl 并在 Excel 中显示结果。用户不想保存 excel 文件然后导航到该文件,他们希望它直接从他们正在使用的网络表单中打开,这就是代码当前所做的。
但是,用户并不关心gridview。他们根本不在乎他们是否看到它。他们只想打开 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 实例中呈现。