2017 年 9 月には、この同じ問題に対処するが答えのない別の質問が 1 つあります: create a pivotchart with python win32com
これを機能させるためにいくつかのアプローチを試みたので、これらを説明し、うまくいけば、これを機能させる方法について誰かから洞察を得たいと思います。これはあまり使い古された道ではないように見えるので、あまり期待はしていません。
環境の詳細:
- ウィンドウズ10
- オフィス 2013
- アナコンダ 3.6
私が使う
win32com.client.gencache.EnsureDispatch('Excel.Application')
しかし、私も使用できます
win32com.client.DispatchEx('Excel.Application')
また
win32com.client.dynamic.Dispatch('Excel.Application')
それぞれがこの CLSID win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x8 を返します
それぞれにも同じエラーがあります。
ここのドキュメントに従って、このコマンドも実行しました。
C:\Users\home_dir>python AppData\Local\Continuum\anaconda3\pkgs\pywin32-223-py36hfa6e2cd_1\Lib\site-packages\win32com\client\makepy.py -i "Microsoft Excel 15.0 Object Library"
Output generated from makepy.py:
Microsoft Excel 15.0 Object Library {00020813-0000-0000-C000-000000000046}, lcid=0, major=1, minor=8
>>> # Use these commands in Python code to auto generate .py support
>>> from win32com.client import gencache
>>> gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 8)
このバージョンの gencache は正常に動作しませんでした:
Excel = win32com.client.gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 8)
ソース データ ExcelWriter を使用して Excel に書き込む Pandas データフレームには 100 行と 18 列があります。
ew = pd.ExcelWriter('c:\devworkspace\SQL-Pandas-Excel\SampleData.xlsx')
sample_data_df.to_excel(ew, sheet_name='Source Data')
ew.save()
ew.close()
Excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
win32c = win32com.client.constants
wb = Excel.Workbooks.Open('c:\devworkspace\SQL-Pandas-Excel\SampleData.xlsx')
src_sheet = wb.Worksheets('Source Data')
rng_row = 100
rng_col = 18
rng_beg = src_sheet.Cells(1,2)
rng_end = src_sheet.Cells(rng_row,rng_col)
pvt_src_rng = src_sheet.Range(rng_beg, rng_end)
pvt_src_rng.Select()
pvt_src = "%s!R1C2:R%dC%d"%(src_sheet.Name,rng_row+1,rng_col+1) #add 1 for header and df index
ピボット キャッシュ .Add() ではなく PivotCaches().Create() を使用するので、Office 2013 の正しいバージョンである Version=win32c.xlPivotTableVersion15 を指定できます。
pc = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=pvt_src, Version=win32c.xlPivotTableVersion15)
この変更によりダイヤルが移動しましたが、私の問題は解決しませんでした - それでもエラーが発生し、チャートが作成されません:
- この変更を適用すると、ピボット テーブルの書式設定が強化されました。
- ルート エラー コードは、「パラメーターが正しくありません」である -2147024809 からルート エラー コード -2146827284 に変更されました。
人間が読めるメッセージに変換できないもの:
print(win32api.FormatMessage(error.excepinfo[5]))
error: (317, 'FormatMessageW', 'The system cannot find message text for message number 0x%1 in the message file for %2.')
このエラー コード 2146827284 を検索すると、議論はビジー状態の Excel オブジェクトに関連しているように見えます。ただし、Excel.Visible は 0 (これもデフォルト) に設定されているため、ヘッドレス モードで実行されています。
シートの追加、ピボット テーブルの作成、フィールドの追加が成功しました 。これらはすべて、実際のコードでは try-except でラップされていますが、簡潔にするために削除されています。
pvt_sheet = wb.Sheets.Add(After=src_sheet)
pvt_sheet.Name = 'Pivot Sheet'
pvt_rng_beg = pvt_sheet.Cells(2,2)
pvt_rng_end = pvt_sheet.Cells(2,2)
pvt_dest_rng = pvt_sheet.Range(pvt_rng_beg, pvt_rng_end)
pt = pc.CreatePivotTable(TableDestination=pvt_dest_rng,TableName='PivotTable1')
pt.AddFields(RowFields="claimant_type_desc" , ColumnFields="claim_cause_desc" )
pt.AddDataField(Field=pt.PivotFields("total_direct_payment"), Caption="Total Incurred")
「ChartDestination」としてシートまたはチャートを追加できますが、どちらのオプションも結果を変更しません。オブジェクトが正常に追加されていることを確認できます。
#chrt_sheet = wb.Charts.Add(After=pvt_sheet)
chrt_sheet = wb.Sheets.Add(After=pvt_sheet)
chrt_sheet.Name = 'Pivot Chart'
ChartDestination 引数は唯一の必須引数で、他の引数はオプションです: XlChartType、Left、Top、Width、Height
ドキュメントはこちら:
例に基づいて、シートまたはチャート オブジェクトの名前を文字列 'Pivot Sheet' として渡します。それはうまくいくはずです。
pch = pc.CreatePivotChart(ChartDestination='Pivot Chart')
パラメータは Variant として定義されているため、文字列を明示的に Variant オブジェクトに割り当てます。さまざまなバリアント タイプを試しましたが、異なる結果は得られませんでした。
chrt_sheet_name_variant = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, chrt_sheet.Name)
print(chrt_sheet_name_variant.value)
print(chrt_sheet_name_variant.varianttype)
print(chrt_sheet_name_variant.__class__)
print(type(chrt_sheet_name_variant))
pch = pc.CreatePivotChart(ChartDestination=chrt_sheet_name_variant)
#Output:
#Pivot Chart
#16392
#<class 'win32com.client.VARIANT'>
#<class 'win32com.client.VARIANT'>
これは生成されるエラーです:
File "C:\Users\xxxxxx\AppData\Local\Temp\gen_py\3.6\00020813-0000-0000-C000-000000000046x0x1x8\PivotCache.py", line 36, in CreatePivotChart
, XlChartType, Left, Top, Width, Height
com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)