1

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)
4

1 に答える 1

3

これについて道を見つけてくれたBoussifに感謝します。

これが私の実用的なソリューションです:

ピボット テーブルからピボット グラフを生成する

前に作成した Workbook オブジェクトを使用して、Chart をワークブックに「挿入」し、チャートに名前を割り当てることができます。名前はタブに表示されます。

ピボット テーブルはワークブック内のオブジェクトであるピボット キャッシュ内のオブジェクトであるため、Chart オブジェクトはピボット チャートとして追加され、ピボット テーブルをデータとして使用します。

関連するドキュメントは次のとおりです。

https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.charts

https://docs.microsoft.com/en-us/office/vba/api/excel.chart(オブジェクト)

chrt_sheet = wb.Charts.Add()
chrt_sheet.Name = 'Pivot Chart'

グラフの種類を指定する

グラフの種類は、Excel プログラムで使用できるものと同じグラフの種類に対応しています。

列挙されたタイプのリストから選択します。

たとえば、3D 縦棒グラフには、次のようにコード化された xl3DColumn の値があります。

win32c.xl3DColumn

列挙リストを含むすべての定数値を参照するには、前に定義した win32c オブジェクト ew を使用します。

ここに文書化されています:

https://docs.microsoft.com/en-us/office/vba/api/excel.chart.charttype

https://docs.microsoft.com/en-us/office/vba/api/excel.xlcharttype

chrt_sheet.ChartType =  win32c.xl3DColumn

チャートのタイトルを設定する

HasTitle プロパティを True に設定するまで、シート オブジェクトには ChartTitle プロパティがありません。

chrt_sheet.HasTitle = True
chrt_sheet.ChartTitle.Text = "Chart Title"

配色を設定する

ChartColor 値 10 ~ 26 は、チャート ツール リボンの [デザイン] タブの [色の変更] メニューに対応します。

chrt_sheet.ChartColor = 13

チャート レイアウトの指定

レイアウトはオプションです

レイアウトは、Excel プログラムで選択するレイアウトのリストと同じです。

この場合、それらは列挙リストとして提供されません。そのため、レイアウトに番号を指定する必要があります。通常は 1 ~ 10 です。レイアウトは、それぞれのチャート タイプによって異なります。選択するレイアウトを見つけるには、Excel プログラムを実行して、それぞれを試す必要があります。マウスをレイアウト オプションの上に置くと、レイアウトの名前とともに「ツール ヒント」が表示されます。例: 「レイアウト 7」。それぞれのレイアウトに関連付けられた番号を提供します。

ApplyLayout メソッドを使用してレイアウトを選択します。

ApplyLayout(Layout, Chart Type)

ここに文書化されています:

https://docs.microsoft.com/en-us/office/vba/api/excel.chart.applylayout

chrt_sheet.ApplyLayout(7, win32c.xl3DColumn)

グラフ スタイルの指定

スタイルはオプションです

ドキュメントには、1 ~ 48 が有効な値であると記載されています。ただし、正しい範囲は、選択したグラフの種類によって異なります。

Chart Typeによっては201~352も有効です。

グラフの種類で使用可能なスタイルの選択に一致する数値を取得するには:

  1. 開発者タブから - マクロを実行する
  2. [グラフのデザイン] タブから - すべてのスタイルを選択します
  3. [開発者] タブから - マクロの実行を停止します
  4. 開発者タブから - マクロを編集する

これにより、ケースの正しい値が明らかになります

立体縦棒グラフ タイプの場合、範囲は 286 ~ 297 です。

関連ドキュメントはこちら:

https://docs.microsoft.com/en-us/office/vba/api/excel.chart.chartstyle

xlChartStyle = 294
chrt_sheet.ClearToMatchStyle
chrt_sheet.ChartStyle = xlChartStyle

グラフ スタイルの実験

興味があり、それぞれがどのように見えるかを見たい場合は、このコードを実行してください

ヒント: コメント「#」を削除してください

#import time
#from time import sleep
​
#for xlChartStyle in range(286, 297):
#    try:
#        chrt_sheet.ClearToMatchStyle
#        chrt_sheet.ChartStyle = xlChartStyle
#        chrt_sheet.ChartTitle.Text = "Chart Style = "+str(xlChartStyle)
#        sleep(1)
#    except pythoncom.com_error as error:
#        print("Chart Style = %s" % str(xlChartStyle))

軸ラベルの書式

XlAxisType Enumeration によって指定された 3 つの軸ディメンションがあります。

  • X 軸 = xlCategory
  • Y 軸 = xlValue
  • Z 軸 = xlSeriesAxis (3D チャートのみ)

この例では、Z 軸の目盛りラベルも削除しています。

chrt_sheet.Axes(win32c.xlCategory).AxisTitle.Text = "X Axis Title"
chrt_sheet.Axes(win32c.xlSeries).TickLabelPosition = win32c.xlNone
chrt_sheet.Axes(win32c.xlSeries).HasTitle = True
chrt_sheet.Axes(win32c.xlSeries).AxisTitle.Text = "Z Axis Title"
chrt_sheet.Axes(win32c.xlValue).AxisTitle.Text = "Y Axis Title"
于 2018-10-18T14:38:15.557 に答える