Самый быстрый способ передавать данные из Excel VBA в код Python
Есть код на VBA который заполняет массивы, учитыывая выбранный диапазон пользователем:
ReDim dataСontract(1 To rng.Rows.Count)
ReDim dataLegal(1 To rng.Rows.Count)
ReDim BuyerTin(1 To rng.Rows.Count)
ReDim dataAddress(1 To rng.Rows.Count)
i = 1
For Each cell In rng.Cells
dataСontract(i) = Cells(cell.Row, 1).Value
dataLegal(i) = ReformatName(Cells(cell.Row, 2).Value)
BuyerTin(i) = Cells(cell.Row, 8).Value
dataAddress(i) = Cells(cell.Row, 13).Value
i = i + 1
Next cell
Затем я еще получаю PDF файл
с данными этих массивов в формате base64
.
Dim base64Pdf As String
base64File = ConvertFileToBase64(pdfFileName)
Все эти массивы надо передавать в код Python, для последующего создания и загрузки данных на сайт. Стало интересно как можно оптимизированнее передавать данные из кода в код? Есть мысль через командную строку, или создавать промежуточный файл, например в формате csv
.
Ответы (2 шт):
В общем да, непонятно, зачем тут Excel. Очевидно, что нужно переработать архитектуру всего решения. Если напишите подробнее, мы вам посоветуем.
А в Excel быстро работать с массивами нужно так:
Dim arr As Variant
arr = [A1:C10] ' получить данные из диапазона в массив
[B2:D11] = arr ' записать массив в диапазон
Дальше массив записывается в файл. Или, если данные на весь лист, тогда просто сохранить лист в CSV.
Если Excel у вас - это основное рабочее интерактивное приложение, то возможна такая реализация:
- По кнопке в Excel данные записываются в файл.
- После чего: а) или оттуда же запускается приложение на Питоне, которое как-то обрабатывает эти данные, б) или данные из файла берутся по запросу из Web - скорее, этот вариант.
Благодарю комментаторов, прилагаю свой скрипт, вдруг кому пригодится. Часть из VBA:
Sub RunPythonScript()
Dim scriptPath As String
Dim shellObj As Object
startTime = Timer
Application.ScreenUpdating = False
Application.Calculation = xlCalculateManual
desktopPath = Environ("USERPROFILE") & "\Desktop"
scriptPath = desktopPath & "\test.py"
Set shellObj = CreateObject("WScript.Shell")
shellObj.Run "python " & scriptPath, 0, True
Application.ScreenUpdating = False
Application.Calculation = xlCalculateManual
endTime = Timer
elapsedTime = endTime - startTime
Debug.Print "Время выполнения кода: " & Format(elapsedTime, "0.00") & " секунд"
End Sub
для python
# Функция для экспорта данных из выделенного диапазона
def export_data_and_convert_pdf():
# Подключение к Excel
excel = win32com.client.Dispatch("Excel.Application")
workbook = excel.ActiveWorkbook
sheet = excel.ActiveSheet
# Получение выделенного диапазона
selection = excel.Selection
# Массив для хранения данных
data_array = []
# Сбор данных из диапазона
for cell in selection:
data_legal = sheet.Cells(cell.Row, 2).Value
# Находим индекс первого символа кавычки
quote_index = data_legal.find('"')
if quote_index != -1:
# Разделяем строку на две части
before_quote = data_legal[:quote_index].strip() # Часть до кавычек
inside_quote = data_legal[quote_index:].strip() # Часть внутри кавычек
# Создаем новую строку с переносом
reversed_data_legal = f'"{inside_quote[1:]} {before_quote}'
else:
# Если нет кавычек, оставляем как есть
reversed_data_legal = data_legal
buyer_tin = sheet.Cells(cell.Row, 8).Value
buyer_tin = int(buyer_tin) if buyer_tin == int(buyer_tin) else buyer_tin
row_data = {
"dataContract": sheet.Cells(cell.Row, 1).Value,
"dataLegal": reversed_data_legal,
"BuyerTin": buyer_tin,
"dataAddress": sheet.Cells(cell.Row, 13).Value,
}
# Добавляем данные в массив
data_array.append(row_data)
# Запуск основного кода
if __name__ == "__main__":
export_data_and_convert_pdf()