web-dev-qa-db-ja.com

Python:Win32 COM APIを使用してExcelワークブックを開く

次のコードを使用して、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からワークブックを開くと、フィルターを保存するために一意の名前を入力するように求められることがあります。何故ですか?これは対話です:

enter image description here

[〜#〜] edit [〜#〜]Okここで(ドイツ語で)後者は問題は2007および2010ファイルの既知のバグです: https://social.msdn.Microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff-5c0d83166e73/Excel-api-interne-namen であり、プログラムでExcel-Filesを開いた場合に存在するようです。回避策があるかどうかはわかりません。

6
tim

解決策を見つけたら、 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
11
Parfait