如何使用 VB 在不循环的情况下将数据表导入 Excel

How to import datatable into Excel without Loop using VB

我正在尝试使用蓝色棱镜将 SQL table 结果导出到 Excel。目前它是通过将 SQL 结果导出到集合,然后将集合导出到 Excel 来完成的。导出约 20K 条记录需要更长的时间(10 分钟)。这是因为 VBO 用于每个循环。

我正在尝试使用一些自定义 VB 代码通过批量更新将集合加载到 excel。

谁能帮我解决这个问题?

我尝试了下面的代码,但它不起作用

' Get to the cell
Dim ws As Object = GetWorksheet(handle, workbookname, worksheetname)
Dim origin As Object = ws.Range(cellref, cellref)
Dim cell As Object = origin
Dim colInd As Integer = 0, rowCount As Integer, rowInd As Integer = 0 ' Offsets from the origin cell

' Deal with the column names first
If includecolnames Then
    For Each col As DataColumn In Collection.Columns
        Try
            cell = origin.Offset(rowInd, colInd)
        Catch ex As Exception ' Hit the edge.
            Exit For
        End Try
        SetProperty(cell, "Value", col.ColumnName)
        colInd += 1
    Next
    rowInd += 1
End If

rowCount = Collection.Rows.Count
xlRange = ws.Range(cellref & ":H" & rowCount)
xlRange.Value = Collection

我得到的错误是:找不到成员。 (HRESULT 异常:0x80020003 (DISP_E_MEMBERNOTFOUND))

我认为您正在寻找 WorkSheet 的这个功能:

ws.SetRangeValues(RowIndex, ColumnIndex, Array(, ))

只需根据您的 SQL 数据在内存中构建二维数组并调用一次即可。它将以比迭代方式更快的速度一次性填充所选 RowIndex 和 ColumnIndex 中的数据。

你接近这个的方式似乎不是很有效,从一个地方抓取结果放入另一个地方,然后再放入另一个地方。您可以尝试其他两种选择吗?

通过 CMD 自动执行命令

sqlcmd -S 。 -d AzureDemo50 -E -s, -W -Q "SELECT * FROM dbo04.ExcelTest" > ExcelTest.csv

类似这样的更多信息 (https://www.excel-sql-server.com/sql-server-export-to-excel-using-bcp-sqlcmd-csv.htm)

在这里,您可以 运行 通过 cmd 行使用 blue prism 命令,然后将值推送到您想要的位置,而无需将内存放在 blue prism 中。

使用像 OLEDB 这样的数据库对象将命令直接解析到数据库中,以将值推送到 excel。

在这两个选项中,数据永远不会进入 Blueprism,因此请注意,您没有机会在 blueprism 中保存、更改数据等,但操作起来要快得多。

测试:使用上述 cmd 制作了一个具有 20k 行 5 列数据导出的数据库花费了 1.7 秒来执行 plus 额外的 1/2 秒用于 blueprism 运行因此总共需要 3-5 秒,内存分配较小你当前的实现。

这是您要找的东西吗?

感谢您的回答。我添加了一个名为 Write Collection - Fast 的新页面,并在 Blue Prism MS Excel VBO 中添加了代码阶段。粘贴以下代码

Dim ws As Object = GetWorksheet(handle, workbookname, worksheetname)
Dim sqlCon As New ADODB.Connection
Dim recordSet As New ADODB.Recordset
Dim iCol As Integer

    sqlCon = New ADODB.Connection
    sqlCon.ConnectionString = "driver={SQL Server};server=xxx\SQLEXPRESS;uid=zzzz;pwd=yyyy;database=testData"
    sqlCon.ConnectionTimeout = 30
    sqlCon.Open


    recordSet.Open (SQL, sqlCon)

    For iCol = 0 To recordSet.Fields.Count - 1
        ws.Cells(1, iCol + 1).Value = recordSet.Fields(iCol).Name
    Next

    ws.Range("A2").CopyFromRecordset(recordSet)

    recordSet.Close
    sqlCon.Close