Обновление листа Excel в режиме реального времени с использованием Python - PullRequest
0 голосов
/ 18 мая 2018

Есть ли способ обновить электронную таблицу в режиме реального времени, пока она открыта в Excel?У меня есть книга с именем Example.xlsx, которая открыта в Excel, и у меня есть следующий код Python, который пытается обновить ячейку B1 с помощью строки 'ID':

import openpyxl

wb = openpyxl.load_workbook('Example.xlsx')
sheet = wb['Sheet']
sheet['B1'] = 'ID'

wb.save('Example.xlsx')

При запуске сценария я получаю эту ошибку:

PermissionError: [Errno 13] Permission denied: 'Example.xlsx'

Я знаю, потому что файл в настоящее время открыт в Excel, но мне было интересно, есть ли другой способ или модуль, который я могу использовать для обновления листа, пока он открыт.

Ответы [ 4 ]

0 голосов
/ 03 августа 2018

Если вы хотите передавать данные в реальном времени в Excel из Python, вы можете использовать функцию RTD.Если вы когда-либо использовали надстройку Bloomberg для доступа к рыночным данным в реальном времени в Excel, то вы будете знакомы с функциями RTD.

Самый простой способ написать функцию RTD для Excel в Python - этоиспользуйте PyXLL.Вы можете прочитать, как это сделать, в документации здесь: https://www.pyxll.com/docs/userguide/rtd.html

Также есть запись в блоге, показывающая, как транслировать живые твиты в Excel с использованием Python, здесь: https://www.pyxll.com/blog/a-real-time-twitter-feed-in-excel/

Если вы хотитечтобы написать RTD-сервер для работы за пределами Excel, вы должны зарегистрировать его как COM-сервер.Пакет pywin32 включает в себя пример, который показывает, как это сделать, однако он работает только для Excel до 2007 года. Для 2007 и более поздних версий вам потребуется этот код https://github.com/pyxll/exceltypes, чтобы этот пример работал (см. Измененный пример изpywin32 в exceltypes / demos в этом репо).

0 голосов
/ 18 мая 2018

Вы не можете изменить файл Excel, который используется другим приложением, поскольку формат файла не поддерживает одновременный доступ.

0 голосов
/ 19 мая 2018

Я на самом деле понял это, и это довольно просто, используя xlwings.Следующий код открывает существующий файл Excel с именем Example.xlsx и обновляет его в режиме реального времени, в этом случае значение 45 в ячейке B2 сразу вводится при запуске сценария.

import xlwings as xw

wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45
0 голосов
/ 18 мая 2018

Вы уже выяснили, почему вы не можете использовать openpyxl для записи в файл .xlsx: он заблокирован, а в Excel он открыт.Вы не можете писать в него напрямую, но вы можете использовать win32com для связи с копией Excel, которая работает через его COM-интерфейс.

Вы можете скачать win32com из https://github.com/mhammond/pywin32.

Используйте это так:

from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
wb=xlApp.Workbooks.Item("MyExcelFile.xlsx")
ws=wb.Sheets("MyWorksheetName")

На данный момент, ws является ссылкойна объект листа, который вы можете изменить.Возвращаемые вами объекты - это не объекты Python, а тонкая оболочка Python вокруг объектов VBA, которые подчиняются собственным соглашениям, а не соглашения Python.

Здесь есть некоторая полезная, но довольно старая документация, ориентированная на Python: http://timgolden.me.uk/pywin32-docs/contents.html

Здесь имеется полная документация для объектной модели: https://msdn.microsoft.com/en-us/library/wss56bz7.aspx, но имейте в виду, что она адресована программистам VBA.

...