次のコードを使用して、Excel内でブックを開いて表示します。
import win32com.client as win32
Excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = Excel.Workbooks.Open('my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
Excel.Visible = True
ファイル「my_sheet.xlsm」がすでに開かれている場合、Excelは保存せずに再度開くかどうかを尋ねます。
ワークブックが既に開いているかどうかを事前に確認し、開いている場合は、それを前面に表示するにはどうすればよいですか?
[〜#〜] edit [〜#〜]:今までに見つかりました:
if Excel.Workbooks.Count > 0:
for i in range(1, Excel.Workbooks.Count+1):
if Excel.Workbooks.Item(i).Name is 'my_sheet.xlsm':
wb = Excel.Workbooks.Item(i)
break
そしてもう1つ質問:私のワークシートには、フィルタリングを有効にしたヘッダーが含まれています。そのため、フィルターが設定されている場合、およびPythonからワークブックを開くと、フィルターを保存するために一意の名前を入力するように求められることがあります。何故ですか?これは対話です:
[〜#〜] edit [〜#〜]Okここで(ドイツ語で)後者は問題は2007および2010ファイルの既知のバグです: https://social.msdn.Microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff-5c0d83166e73/Excel-api-interne-namen であり、プログラムでExcel-Filesを開いた場合に存在するようです。回避策があるかどうかはわかりません。
解決策を見つけたら、 try/except/finally ブロックの使用を検討してください。現在、表示されているワークシートを閉じても、コードはExcel.exeプロセスをバックグラウンドで実行したままにします(Windowsを使用している場合はタスクマネージャーを確認してください)。余談ですが、PythonまたはVBAのような他の言語では、このCOMインターフェイスなどの外部APIは、アプリケーションコードの実行中に常にきれいにリリースする必要があります。
以下の解決策は、定義された関数openWorkbook()
を使用して2つの潜在的なルートに移動します。1)最初に、指定されたワークブックが開かれていると想定して再起動を試み、2)現在開かれていない場合は、その場所の新しいワークブックオブジェクトを起動します。ファイル名が正しくないなど、Workbooks.Open()
メソッドが失敗した場合に、最後にネストされたtry/except
が使用されます。
import win32com.client as win32
def openWorkbook(xlapp, xlfile):
try:
xlwb = xlapp.Workbooks(xlfile)
except Exception as e:
try:
xlwb = xlapp.Workbooks.Open(xlfile)
except Exception as e:
print(e)
xlwb = None
return(xlwb)
try:
Excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = openWorkbook(Excel, 'my_sheet.xlsm')
ws = wb.Worksheets('blaaaa')
Excel.Visible = True
except Exception as e:
print(e)
finally:
# RELEASES RESOURCES
ws = None
wb = None
Excel = None