微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将数据表放入新工作表

如何解决将数据表放入新工作表

我正在尝试使用 VB 将数据表导入 Excel。我找到了很多方法来做到这一点,但所有方法都给我带来了问题。

我尝试的第一种方法是使用 ClosedXML。它非常适合导入数据,但它弄乱了数据透视表。这是一个已知的问题。另外,如果数据表太大,它会抛出内存不足异常,这是另一个已知问题。

然后我切换到 Interop。但是使用 Interop 我只能找到一种导入数据的方法,那就是双循环,如下所示。对我来说,这里的问题是,导入一个 3k 行、39 列的表需要超过 15 分钟。无论如何,这种方法对我来说似乎很慢且效率低下,而且我无法想象 Microsoft 没有实施一种更有效的方法来导入更大的数据表。

有人可以告诉我更好的方法吗?

For i As Integer = 0 To datatable.Rows.Count() - 1
  For j As Integer = 0 To datatable.Columns.Count() - 1
    xlWorkSheet.Cells(i + 2,j + 1) = datatable.Rows(i)(j).ToString()
  Next
Next

Fadi 的回复快速的谷歌搜索为我解决了这个问题。

    'dt is your Datatable and xlWorksheet is Your Worksheet
    Dim cc = dt.Columns.Count
    Dim rc = dt.Rows.Count        

    Dim arr(rc - 1,cc - 1) As Object
    For r = 0 To rc - 1
        Dim dr = dt.Rows(r)
        For c = 0 To cc - 1
            arr(r,c) = dr(c).ToString 'I added ToString() here,because it raised an type error
        Next
    Next
    xlWorkSheet.Range("A2").Resize(rc,cc).Value = arr

解决方法

逐个单元格填充 Excel 范围很慢,您可以创建二维数组并从数据表填充它,然后将此数组分配给 Excel 范围。

在我对具有 3000 行和 39 列的数据表进行的测试中,此代码需要 670 毫秒。

    'dt is your Datatable and xlWorksheet is Your Worksheet
    Dim cc = dt.Columns.Count
    Dim rc = dt.Rows.Count        

    Dim arr(rc - 1,cc - 1) As Object
    For r = 0 To rc - 1
        Dim dr = dt.Rows(r)
        For c = 0 To cc - 1
            arr(r,c) = dr(c)
        Next
    Next
    xlWorkSheet.Range("A2").Resize(rc,cc).Value = arr

测试:

Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click

    Dim xl = New Excel.Application
    Dim wb = xl.Workbooks.Add()
    Dim xlWorkSheet As Excel.Worksheet = CType(wb.Worksheets(1),Excel.Worksheet)
    Dim dt = CreateDatatable()

    Dim cc = dt.Columns.Count
    Dim rc = dt.Rows.Count
    Dim tt = Now.Ticks

    Dim arr(rc - 1,cc).Value = arr
    Dim ee = (Now.Ticks - tt) / 10000
    MsgBox(ee)
    xl.Visible = True
    xl.UserControl = True

End Sub

Function CreateDatatable() As DataTable

    Dim dt = New DataTable
    For c = 1 To 39
        dt.Columns.Add($"Col{c}")
    Next
    For r = 1 To 3000
        Dim dr As DataRow = dt.NewRow
        For c = 1 To 39
            dr(c - 1) = $"R{r},C{c}"
        Next
        dt.Rows.Add(dr)
    Next
    Return dt

End Function

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。