Страницы: 1
RSS
Использование BedvitCOM.dll в своем проекте на Python
 
Пока не знаю, будет ли отдельный проект по автоматизации для Python, но те, кто пользуется BedvitCOM.dll, могут использовать её в своем проекте и на Python (в т.ч. и для Excel, используя xlrd, xlwt, xlutils или openpyxl и т.д.)
Регистрируем, пользуемся.
Код
# использование BedvitCOM-DLL
from win32com import client
bCOM = client.DispatchEx('BedvitCOM.BignumArithmeticInteger')
bCOM.Factorial (0, 1024)
print(bCOM.Bignum (0))


Все строковые функции работают, работает длинная арифметика.
Будет ли работать функционал меняющий данные на месте, массивы (сортировка, фильтр) - непонятно, нужно тестировать.
Сейчас хочу попробовать подключить фильтр, протестировать, к примеру на задаче на фильтрацию по 2000 условиям.
Пока вся сложность в массивах.
Изменено: bedvit - 20.10.2022 20:11:03
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, прокачка пайтона однозначно нужна. Это массовый продукт, как раз заточенный на использование библиотек.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Было бы интересно, если удастся выяснить будет ли работать, попробовать и потестировать.
 
В Python весь функционал BedvitCOM.dll - работает!
Вот тест на задаче фильтрации по 2 тыс. условий
Код
from win32com import client
bCOMvba = client.DispatchEx('BedvitCOM.VBA')
print(bCOMvba.version())

from openpyxl import load_workbook
import time

t1=time.time()
filename1 = r'C:\Удаление_стоп-слов_Python3.xlsx'
wb = load_workbook(filename1, read_only=False)
sheet1 = wb['Данные']
sheet2 = wb['Стоп-слова']
sheet3 = wb['Лист1']

data = list(sheet1.values)
dataF = list(sheet2.values)

t2=time.time()
resCom=bCOMvba.ArrayFilterV(data, dataF, 0)
t3=time.time()

for i, statN in enumerate(resCom[0]):
    sheet3.cell(row=i+1, column=1).value = statN[0]

wb.save(filename1)
t4=time.time()
print("Загрузка файла и данных",t2-t1)
print("Фильтрация ArrayFilterV",t3-t2)
print("Загрузка на лист Excel и сохранение файла",t4-t3)
print("Итого",t4-t1)


BedvitCOM.dll_v3.0.221019.001314_x64_Release

Загрузка файла и данных, сек  15.294197797775269
Фильтрация ArrayFilterV, сек  4.903175354003906
Загрузка на лист Excel и сохранение файла, сек  18.162644147872925
Итого, сек  38.3600172996521

Итого библиотека фильтрует данные и выводит в кортеж за 4.9 сек. Остальное время на открытие/закрытие файла и чтение/запись данных.
Возможно опытные Пайтонисты подскажут как сократить это время. Читать из уже открытой книги или возможно датафреймы будут быстрее и т.д.

Файл пример прилагаю (основной массив нужно дополнить из файла примера, т.к. файл с полным массивом не пролезает по размеру).
Собственно это тот же файл, как в первоначальной теме, только без заголовков (для простоты кода Python в части получения первоначального массива)
Изменено: bedvit - 20.10.2022 10:00:06
«Бритва Оккама» или «Принцип Калашникова»?
 
Тайминги для открытого документа
Загрузка файла и данных, сек  0.43199872970581055
Фильтрация ArrayFilterV, сек  4.966533184051514
Загрузка на лист Excel и сохранение файла, сек  0.8736157417297363
Итого, сек  6.2721476554870605

Код
from win32com import client
import time

t1=time.time()
bCOMvba = client.DispatchEx('BedvitCOM.VBA')
ExcelApp = client.GetActiveObject("Excel.Application")
workbook = ExcelApp.ActiveWorkbook
sheet1 = workbook.sheets('Данные')
sheet2 = workbook.sheets('Стоп-слова')
sheet3 = workbook.sheets('Лист1')
# data = [(1, 'Apple', 2, 4.0), (2, 'Orange', 3, 5.0), (3, 'Peach', 5, 5.0), (4, 'Pear', 6, 5.0)]
data = list(sheet1.Range("A1:A273495").Value2)#usedrange
dataF = list(sheet2.Range("A1:F2097").Value2)

t2=time.time()
resCom=bCOMvba.ArrayFilterV(data, dataF, 0)
t3=time.time()

sheet3.Range("A:A").clear
sheet3.Range(sheet3.Cells(1,1),sheet3.Cells(len(resCom[0]),1)).Value2 = resCom[0]
t4=time.time()

print("Загрузка файла и данных, сек ",t2-t1)
print("Фильтрация ArrayFilterV, сек ",t3-t2)
print("Загрузка на лист Excel и сохранение файла, сек ",t4-t3)
print("Итого, сек ",t4-t1)
«Бритва Оккама» или «Принцип Калашникова»?
 
Может быть скоро можно будет вот так:
Код
from bCOMvba import ArrayFilterV

с переездом темы на другую планету )
Страницы: 1
Наверх