web-dev-qa-db-ja.com

Pythonを使用してリアルタイムでExcelシートを更新する

Excelで開いているときにスプレッドシートをリアルタイムで更新する方法はありますか? Excelで開いているExample.xlsxというワークブックがあります。次の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で開いているのでわかっていますが、開いている間にシートを更新するために使用できる別の方法またはモジュールがあるかどうか疑問に思っていました。

7
West

私は実際にこれを理解しており、xlwingsを使用すると非常に簡単です。次のコードは、Example.xlsxという既存のExcelファイルを開き、リアルタイムで更新します。この場合、スクリプトを実行するとすぐにセルB2の値45がすぐに挿入されます。

import xlwings as xw

wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45
5
West

openpyxlを使用して.xlsxファイルに書き込むことができない理由はすでにわかっています。Excelが開いている間はロックされています。直接書き込むことはできませんが、win32comを使用して、COMインターフェイス経由で実行されているExcelのコピーと通信できます。

win32comhttps://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プログラマー向けのものです。

4
BoarGules

PythonからExcelにリアルタイムデータをストリーミングする場合は、RTD関数を使用できます。 Excelでリアルタイムの市場データにアクセスするためにブルームバーグアドインを使用したことがある場合は、RTD関数に慣れているはずです。

PythonでExcelのRTD関数を記述する最も簡単な方法は、PyXLLを使用することです。その方法は、次のドキュメントで読むことができます: https://www.pyxll。 com/docs/userguide/rtd.html

Python here: https://www.pyxll.com/blog/a-real-time-Twitter-を使用してライブツイートをExcelにストリーミングする方法を示すブログ投稿もあります。フィードインエクセル/

Excelの外部で実行するRTDサーバーを作成する場合は、それをCOMサーバーとして登録する必要があります。 pywin32パッケージには、その方法を示す例が含まれていますが、2007より前のExcelでのみ機能します。2007以降のバージョンでは、このコードが必要になります https://github.com/pyxll/exceltypes =その例を機能させるには(そのリポジトリのexceltypes/demosにあるpywin32の変更例を参照してください)。

0
Tony Roberts

ファイル形式は同時アクセスをサポートしていないため、別のアプリケーションで使用されているExcelファイルを変更することはできません。

0
Charlie Clark