【问题标题】:Open DataTable in Excel VB在 Excel VB 中打开数据表
【发布时间】:2015-03-16 22:44:20
【问题描述】:

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

然而,用户并不关心gridview。他们根本不在乎他们是否看到它。他们只想打开 Excel。因此,我不想使用 gridview.RenderControl,而是想打开 Excel 并用内存中的 DataTable(或 DataSet)填充它。对最好的方法有什么想法吗?

这是他们当前填充网格视图的方式: 将 MyConnection 调暗为 SqlConnection 将 MyCommand 调暗为 SqlCommand 将 MyDataTable 调暗为 DataTable 将 MyReader 调暗为 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 实例中呈现。

【问题讨论】:

    标签: asp.net vb.net excel datatable rendercontrol


    【解决方案1】:

    好的,这是我找到的解决方案(以防万一有人感兴趣)。其实很简单。我只是遍历了数据表并使用了 StringWriter。

        Protected Sub WriteToExcelFile(dt As DataTable)
        Dim sw As StringWriter
    
        For Each datacol As DataColumn In dt.Columns
            sw.Write(datacol.ColumnName + vbTab)
        Next
    
        Dim row As DataRow
        For Each row In dt.Rows
            sw.Write(vbNewLine)
            Dim column As DataColumn
            For Each column In dt.Columns
                If Not row(column.ColumnName) Is Nothing Then
                    sw.Write(row(column).ToString() + vbTab)
                Else
                    sw.Write(String.Empty + vbTab)
                End If
            Next column
        Next row
    
        Response.Clear()
        Response.ContentType = "application/vnd.ms-excel"
        Response.AddHeader("Content-Disposition", "attachment;filename=DataTable.xls")
        Response.Output.Write(sw.ToString())
        Response.Flush()
        System.Web.HttpContext.Current.Response.Flush()
        System.Web.HttpContext.Current.Response.SuppressContent = True
        System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest()
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 2014-01-28
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多