1

我有一个使用各种输入创建的数据表。有时结果表是 35000+ 行。目前,数据表显示在网格视图上。几分钟后加载正常。然后,可以选择将 gridview 导出到 excel 文件。每次我们有一个大表要导出时,转换都会失败。

我的目标是绕过 gridview 步骤并获取格式化表格并将其直接放入 excel 文件中。如果写入/加载速度更快,也可以是 csv 文件,只要数据表类似于 gridview 输出。

我在这里尝试了以下代码Export DataTable to Excel File。我尽力将它转换为vb,在这里......

Protected Sub btnExportData_Click(sender As Object, e As EventArgs) Handles btnExportData.Click
    Dim dt As DataTable
    dt = CreateDataSource()
    Dim filename As String = "attachment; filename=DistComplain.xls"
    Response.ClearContent()
    Response.AddHeader("content-disposition", filename)
    Response.ContentType = "application/vnd.ms-excel"
    Dim tab As String = ""
    For Each dc As DataColumn In dt.Columns
        Response.Write((tab + dc.ColumnName))
        tab = "" & vbTab
    Next
    Response.Write("" & vbLf)
    Dim i As Integer
    For Each dr As DataRow In dt.Rows
        tab = ""
        i = 0
        Do While (i < dt.Columns.Count)
            Response.Write((tab + dr(i).ToString))
            tab = "" & vbTab
            i = (i + 1)
        Loop
        Response.Write("" & vbLf)
    Next
    Response.End()
End Sub

CreateDataSource() 是在内存中创建的表。然后还有其他按钮调用它来填充gridview。现在它成功地编译并运行,然后它成功地创建了文件。虽然,当文件试图打开我得到这个错误......

Excel 错误

当我同时尝试 xls 和 csv 文件时会发生这种情况。有些东西翻译不正确。有什么解决办法吗?

4

2 回答 2

1

(在 Google 的帮助下编写)使用StringWriter 类创建导出:

Public Shared Sub ExportDataSetToExcel(ds As DataSet, filename As String)
    Dim response As HttpResponse = HttpContext.Current.Response

    'Clean response object
    response.Clear()
    response.Charset = ""

    'Set response header
    response.ContentType = "application/vnd.ms-excel"
    response.AddHeader("Content-Disposition", "attachment;filename=""" & filename & """")

    'Create StringWriter and use to create CSV
    Using sw As New StringWriter()
        Using htw As New HtmlTextWriter(sw)
            'Instantiate DataGrid
            Dim dg As New DataGrid()
            dg.DataSource = ds.Tables(0)
            dg.DataBind()
            dg.RenderControl(htw)
            response.Write(sw.ToString())
            response.[End]()
        End Using
    End Using
End Sub

您只需向函数传递数据集和文件名。如果您不想编辑CreateDataSource()函数,可以先将其合并到 DataSet 中,如下所示:

Dim dt As DataTable = CreateDataSource()
Dim ds As New DataSet
ds.Merge(dt)
于 2012-09-14T20:03:28.793 回答
0

您的问题是关于为什么您会收到有关无法打开文件的消息,对吗?

根据 Microsoft 的说法,当您打开“忽略使用动态数据交换 (DDE) 的其他应用程序”设置时会发生这种情况。(见这里)。该链接包含更改设置的说明。

于 2012-09-14T21:46:45.010 回答