7

次のコードを使用して、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 が尋ねてきます。

ワークブックが既に開いているかどうかを事前に確認するにはどうすればよいですか?

編集:今までにわかった:

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 からワークブックを開くと、フィルターを保存するために一意の名前を入力するように求められることがあります。何故ですか?これはダイアログです:

ここに画像の説明を入力

編集OK ここでは、後者の問題は 2007 および 2010 ファイルの既知のバグであると (ドイツ語で) 述べています: https://social.msdn.microsoft.com/Forums/de-DE/3dce9f06-2262-4e22-a8ff- 5c0d83166e73/excel-api-interne-namenプログラムで Excel-Files を開くと存在するようです。回避策があるかどうかはわかりません。

4

1 に答える 1

14

解決策が見つかったら、try/except/finallyブロックの使用を検討してください。現在、表示されているワークシートを閉じても、コードは Excel.exe プロセスをバックグラウンドで実行したままにします (Windows を使用している場合はタスク マネージャーを確認してください)。余談ですが、Python や VBA などの他の言語では、この COM インターフェイスなどの外部 API は、アプリケーション コードの実行中に常にクリーンにリリースする必要があります。

以下のソリューションでは、定義された関数を使用して、openWorkbook()2 つの潜在的なルートに進みます。1) 最初に、指定されたワークブックが開かれていると仮定して再起動を試み、2) 現在開いていない場合は、その場所の新しいワークブック オブジェクトを起動します。ファイル名が正しくないなど、メソッドが失敗した場合は、最後にネストされたtry/exceptものが使用されます。Workbooks.Open()

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
于 2016-10-05T18:03:07.950 に答える