Запустить скрипт Python нажатием кнопки из Excel
Возникла необходимость периодически обновлять данные в ячейках таблицы Excel. Сам алгоритм перерасчета тяжелый и основан на ML-модели, уложенного в скрипт Python. Но использовать его будут пользователи, далекие от мира программирования, поэтому необходимо сделать так, чтобы обновление (то есть отработку самого скрипта) возможно было запустить нажатием обычной кнопки на этом же листе Excel. Для понимания прикладываю то, чего нужно добиться:

При нажатии кнопки "Обновить" должен запускаться заранее разработанный скрипт Python, который, в конечном счете, обновит значения всех ячеек таблицы.
Возникли очень большие сложности с тем, как реализовать данную идею, а в интернете ничего более-менее понятно изложенного я не нашел. помогите, пожалуйста, решить данную задачу. Для облегчения понимания предположим, что:
- скрипт Python лежит в папке с путем "С:\folder_script"
- название скрипта "script"
- эксель-файл лежит в папке с путем "С:\folder_table"
- название скрипта "table"
Уже очень долго не могу сделать ничего толкового. Заранее благодарен)))
Ответы (2 шт):
Описание необходимых действий Но все эти действия необходимо проводить на каждом компьютере, где Вы хотите настроить такую интеграцию. Это конечно значительно сужает область применения. Но более простого способа я не нашел (когда мне необходимо было решить подобную задачу). Либо, как вариант скомпилировать .py в .exe, а на кнопку прикрутить vba скрипт типа:
Sub Primer1()
Dim myTest
myTest = Shell("""С:\folder_script\my_python_script.exe""", vbNormalFocus)
End Sub
Для примера сделал простенькую модель.
main.py: создает фрейм из массива случайных чисел, записывает в.csvи ждет 2 секунды, имитируя длительные вычисления.
import time
import pandas as pd
import numpy as np
df = pd.DataFrame(
['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь',
'Декабрь'], columns=['Месяц'])
df[[f'Column_{i}' for i in range(1, 4)]] = np.random.random(12 * 3).reshape(12, 3)
df.to_csv(r'c:\test\random_data.csv', decimal=',', sep=';', encoding='windows-1251')
time.sleep(2)
Книга Excel, где на Лист2 импортированы данные из этого
.csvчерез "Данные / Из текстового/ CSV файла" / Загрузить:
Также на этом листе есть кнопка "Обновить данные", которой назначен макрос
RefreshData(), который с помощьюWshShell.Exec()запускает и мониторит процесс выполнения python скрипта. По завершении скрипта обновляет ту самую таблицу на Лист2:
Sub RefreshData()
py_script_path = """C:\Users\Alex20\PycharmProjects\test\main.py"""
py_exe_path = """c:\Users\Alex20\PycharmProjects\test\venv\Scripts\python.exe"""
Set WshShell = CreateObject("WScript.Shell")
Set WshExec = WshShell.Exec(py_exe_path & " " & py_script_path)
Do
Status = WshExec.Status
Debug.Print "status - " & Status
If Status = 1 Then Exit Do
Application.Wait Now + TimeSerial(0, 0, 1)
DoEvents
Loop
ThisWorkbook.Sheets("Лист2").ListObjects(1).Refresh ' обновляем таблицу по завершении подготовки данных
End Sub
Из небольших неудобств - черное консольное окно на время выполнения соотв. скрипта.
