pythonからExcel2019のデータをピボットテーブルにしたい
Python から Excel を編集し、ピボットテーブルを作成する
こちらを参考にピボットテーブルにできるかどうか調べています。
発生している問題・エラーメッセージAttributeError:xlDataBase
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-23-09a99b872c36> in <module> 21 wbs2 = wb.Sheets(wbs2_name) 22 pvt_name = 'pvt' ---> 23 pc = wb.PivotCaches().Create(SourceType:=win32c.xlDataBase, SourceData:=wbs1.UsedRange) 24 pc.CreatePivotTable(TableDestination='{sheet}!R3C1'.format(sheet=wbs2_name), TableName=pvt_name) 25 c:\py\python38\lib\site-packages\win32com\client\__init__.py in __getattr__(self, a) 178 if a in d: 179 return d[a] --> 180 raise AttributeError(a) 181 182 # And create an instance. AttributeError: xlDataBase
該当のソースコード
python
1import pandas as pd 2import random 3from datetime import datetime as dt 4 5#テストデータを作成 6record = [] 7for y in range(2015, 2020): 8 for m in range(1, 13): 9 for shop in ['A', 'B', 'C']: 10 date = dt(year=y, month=m, day=1).strftime('%Y-%m-%d') 11 price = 200 + random.randint(0,100) 12 record.append([date, shop, price]) 13 14df_record = pd.DataFrame(record) 15df_record.columns = ['date', 'shop', 'price'] 16df_record['date'] = pd.to_datetime(df_record['date']) 17df_record.to_excel('test.xlsx', index=None) 18 19 20import win32com.client as win32 21import os 22win32c = win32.constants 23 24excel = win32.gencache.win32com.client.Dispatch('Excel.Application')#EnsureDispatch('Excel.Application') 25excel.Visible = True 26 27fpath = os.path.join(os.getcwd(),'test.xlsx') 28wb = excel.Workbooks.Open(fpath) 29 30## Sheet 1 指定し、フィルターを有効にする 31wbs1 = wb.Sheets('Sheet1') 32wbs1.Columns.AutoFilter(1) 33 34## ピボットテーブルの作成 35wbs2_name = 'pivot' 36wb.Sheets.Add().Name = wbs2_name 37wbs2 = wb.Sheets(wbs2_name) 38pvt_name = 'pvt' 39 40 41pc = wb.PivotCaches().Create(SourceType=win32c.xlDataBase, SourceData=wbs1.UsedRange) 42pc.CreatePivotTable(TableDestination='{sheet}!R3C1'.format(sheet=wbs2_name), TableName=pvt_name) 43 44## ピボットテーブルの設定 45wbs2.PivotTables(pvt_name).PivotFields('date').Orientation = win32c.xlRowField 46wbs2.PivotTables(pvt_name).AddDataField(wbs2.PivotTables(pvt_name).PivotFields('price'), 'Ave/price', win32c.xlAverage).NumberFormat = '0' 47wbs2.PivotTables(pvt_name).PivotFields('price').Orientation = win32c.xlPageField 48 49## 日付のグループの選択 50## Periods=(秒, 分, 時, 日, 月, 四半期, 年) 51wbs2.Cells(4, 1).Select() 52excel.Selection.Group(Start=True, End=True, Periods=(False, False, False, False, True, False, True)) 53 54## ファイルを閉じる 55wb.Close(True) 56excel.Quit() 57
試したこと
当初以下のエラーが出たため
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'MinorVersion'
python-win32com excel com model started generating errors
こちらを参考にtempフォルダの生成ファイルを取り除き
合わせて
excel = win32.gencache.win32com.client.EnsureDispatch('Excel.Application')
の記述を
excel = win32.gencache.win32com.client.Dispatch('Excel.Application')
に変更しました
XlPivotTableSourceType 列挙 (Excel)
MSのVBAリファレンスも参考にしたのですがxlDataBaseをXlDataBaseなど大文字に変えてみたり
=を:=にしたりしましたが変化ありませんでした。
このようなケースをご存じの方 もしいらっしゃれば ご教授いただけますとありがたいです。
2021/7/8 追記
かなり古い記事ですが以下記事を見つけました。
win32comで、makepyを使って COM(AcitveX)の定数をロードさせる手順について
AttributeError 上記xlDatabaseのみではなくxlAscendingなどの要素も呼び出せないことから
Constant定数の中身がどうなっているかを確認してみることにしました。
constants.__dicts__
だと []のみで空のリストが返されたのでなにも含まれていませんでした。
win32com 下の client > makepy.pyでMicrosoft Excel ObjectLibraryを読み込む方法もあるようだったので
呼び出しをしてみましたが
pywintypes.com_error: (-2147319765, '要素が見つかりません。', None, None)
と出現し進むことはかないませんでした。
Python Programming on Win32: Chapter 12 Advanced Python and COM(O'Reilly Python 2000年版一部)11ページ目
こちらに以下のような記載を見つけたのでなんらか追加の処理をしたらよいのか・・・と思案しているのですが
今のところ良い方法が見つかっていない状況です。【入れ直しなどが必要なものなのか…】
Of course, because these constants are read from a type library, they aren't available when you
use late-bound (or dynamic dispatch) objects. In this case, you must use integer literals, rather
than named constants in your source code.
"<一部goole翻訳>もちろん、これらの定数はタイプライブラリから読み取られるため、次の、遅延バインド(または動的ディスパッチ)オブジェクトを使用する場合は使用できません。 この場合では、ソースコード内の名前付き定数よりも むしろ整数リテラルを使用する必要があります 。"
How to Use the PyIDispatch Object in Pythoncom (YouTube)
こちらも参考になるのかもしれません(エクセルオブジェクトを作成した際にCLSID情報?が.pyで自動生成されるはずですがmakepy.pyが動作できなかったため自分のところではConstantsもカラになったままのようです)
2021/7/9追記
win32com 下のclient ディレクトリから再度makepy.pyでExcelObject 以外のライブラリ(Microsoft ActiveX Data Objects 6.1 Library)をテストで呼び出してみました
すると問題なく
"Building definitions from type library...
Generating...
Importing module"と表示されgen_pyフォルダ内にも問題なく"B691E011-1797-432E-907A-4D8C69339129x0x6x1"ファイルとして反映されていることが確認できました。
パソコン自体の問題の可能性も考え一通りwindows更新とセキュリティスキャン、ハード診断を行ったあと
再度makepy.pyよりMS Excel Objectをインポートしようとしましたが
今回も"pywintypes.com_error: (-2147319765, '要素が見つかりません。', None, None)"となり
失敗したのを確認しました。
再度同様のエラーで困っている人がいるか
"Could not locate a type library matching 'Microsoft Excel 16.0 Object Library(1.9)' makepy"
などで検索をかけたところ
下記にて
制作元へのissue がすでに二年前に発行されているものであることを確認しました。
GitHub:64ビットのOffice2016(64ビットのPythonを使用)での作業makepyは、アプリケーションオブジェクトライブラリを名前で見つけられないようです。
いまだ問題が閉じられずペンディングとなっていることが確認できました。
残念ですが今回は上記win32com の問題は解決は難しいものと考え
念のため履歴として残しておきます。
気が向きましたら製作元へissue文を投げてみるかもしれません
("win32comを使って"というのはあきらめて pythonから"なんらかを使用して"pivottableをエクセル上で作成するという方針に切り替えます)
補足情報(FW/ツールのバージョンなど)
windows10 (64 pro)
Excel 2019
Python 3.8
pywin32 301
Jupyter-lab 3.0.13
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー