2

Python用のwin32comクライアントを使用して、Excelシートから反復せずに列全体を読み取る方法を知りたかった.

4

3 に答える 3

13

Rangeコレクションを使用して、シートから反復せずに列全体を読み取ることができます。にきびが気になる場合は、絶対に使用しCellsないでください。Python は、win32com モジュールを使用して Excel COM ライブラリと対話します。Python と COM (Excel、PowerPoint、Acess、ADODB など) を使用するときは常に、COM と Python 間の IO が最大のパフォーマンス制約の 1 つになります。このRangeメソッドを使用すると、COM メソッド呼び出しを 1 つだけ行いCellsますが、行ごとに 1 つ作成します。VBA または .NET で同じことを行っている場合、これも高速になります。

次のテストでは、セル A1 から A2000 にランダムな 10 文字を含むワークシートを作成しました。次に、Range と Cells の両方を使用して、これらの値をリストに抽出しました。

import win32com.client
app = win32com.client.Dispatch("Excel.Application")
s = app.ActiveWorkbook.Sheets(1)

def GetValuesByCells():
    startTime = time.time()
    vals = [s.Cells(r,1).Value for r in range(1,2001)]
    return time.time() - startTime

def GetValuesByRange():
    startTime = time.time()
    vals = [v[0] for v in s.Range('A1:A2000').Value]
    return time.time() - startTime

>>> GetValuesByRange()
0.03600001335144043

>>> GetValuesByCells()
5.27400016784668

この場合、Range は Cells よりも 2 桁 (146 倍) 高速です。Range メソッドは、各内部リストが行である 2D リストを返すことに注意してください。リストの反復valsは、内部リストが列である 2D リストに転置されます。

于 2013-09-03T14:46:32.527 に答える