Как импортировать данные в Excel без цикла с помощью VB - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь экспортировать результат таблицы SQL в 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))

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Я думаю, что вы ищете эту функцию WorkSheet:

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

Просто создайте двумерный массив в памяти на основе ваших данных SQL и вызовите его один раз. Он заполнит данные из выбранных RowIndex и ColumnIndex сразу намного быстрее, чем итеративным способом.

0 голосов
/ 20 октября 2019

Спасибо за ваши ответы. Я добавил новую страницу под названием 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
0 голосов
/ 19 октября 2019

способ, которым вы приближаетесь к этому, кажется не очень эффективным: захват результатов из одного места в другое, а затем в другое. вот две другие альтернативы, которые вы можете попробовать?

Автоматизировать команду через CMD

sqlcmd -S. -d AzureDemo50 -E -s, -W -Q "ВЫБРАТЬ * ОТ dbo04.ExcelTest"> ExcelTest.csv

что-то вроде этого больше информации (https://www.excel -sql-server.com / sql-server-export-to-excel-using-bcp-sqlcmd-csv.htm )

здесь вы можете выполнить команду через строку cmd с синей призмой, а затем нажать на значение, куда вы хотитеидти без необходимости помещать память в синюю призму вообще.

Используйте объект db, такой как OLEDB, для синтаксического анализа команды прямо в БД, чтобы передать значения в Excel.

В обоих этих вариантах данные никогда не попадают в Blueprism, так что обратите внимание, вы неполучите возможность сохранять, изменять и т. д. данные в blueprism, однако работать с ними намного быстрее.

test: создание базы данных с 20 тыс. Строк. Экспорт данных из 5 столбцов с использованием вышеупомянутого cmd занял 1,7 секунды, чтобы выполнить дополнительные полторы секунды для запуска blueprism, так что всего 3-5 секунд с меньшим выделением памяти, чем ваша текущая реализация. .

это то, что вы искали?

...