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で開いているのでわかっていますが、開いている間にシートを更新するために使用できる別の方法またはモジュールがあるかどうか疑問に思っていました。
私は実際にこれを理解しており、xlwingsを使用すると非常に簡単です。次のコードは、Example.xlsxという既存のExcelファイルを開き、リアルタイムで更新します。この場合、スクリプトを実行するとすぐにセルB2の値45がすぐに挿入されます。
import xlwings as xw
wb = xw.Book('Example.xlsx')
sht1 = wb.sheets['Sheet']
sht1.range('B2').value = 45
openpyxl
を使用して.xlsx
ファイルに書き込むことができない理由はすでにわかっています。Excelが開いている間はロックされています。直接書き込むことはできませんが、win32com
を使用して、COMインターフェイス経由で実行されているExcelのコピーと通信できます。
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プログラマー向けのものです。
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の変更例を参照してください)。
ファイル形式は同時アクセスをサポートしていないため、別のアプリケーションで使用されているExcelファイルを変更することはできません。