【问题标题】:Exporting datatable to excel file with save dialog使用保存对话框将数据表导出到 excel 文件
【发布时间】:2012-09-07 23:23:38
【问题描述】:

我正在创建一个包含各种输入的数据表。有时结果表是 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。现在它成功地编译并运行,然后它成功地创建了文件。虽然,当文件试图打开我得到这个错误......

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

【问题讨论】:

  • 8列,我也刚试过excel修复Here

标签: asp.net vb.net excel datatable


【解决方案1】:

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

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)

【讨论】:

  • 看起来它创建了我想要的表结构。当我在记事本中查看时,它使用 html 标签,但仍然无法在 excel 中打开
  • 另外,您是否尝试过将文件保存在临时文件夹以外的位置,例如保存在 Documents 中?
  • 目前它正在屏幕底部的 IE9 保存对话框中打开,我可以将它从那里保存到下载文件夹。每当我从此对话框单击打开时,就会发生错误。
  • 好吧好吧,我刚刚在另一台电脑上试了一下,它似乎可以工作,但我现在收到这个错误Here
  • 您将什么文件名传递给 ExportDataSetToExcel 函数?确保它是“FileNameHere.xls”
【解决方案2】:

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

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

【讨论】:

  • 在第二条评论中我说我已经尝试过了,但没有成功,但谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多