xlwingsで「名前の定義」から値を取得する操作方法です。Pythonからエクセルを操作する方です。
エクセルの名前の定義から値を取得するため、xlwingsの公式を見たのですが、値の取得のサンプルが「範囲」がシートのものしかありません。名前の「範囲」は、ブックと各シートに割り当てられるものの2種類があります。
今回使ったエクセルは下のものです。公式のように取得できる「範囲」がシートだけだと、name_sheet1とname_sheet2しか分からなくなってしまいます。
実は「範囲」がブックのものは、クラス構造から容易に想像がつきました。しかし、詳細まで知っておく必要があるので、参考になるよう調べておきました。
名前の範囲がシートの場合のセルの値の取得方法
シート内にある名前の一覧の取得
xlwings.main.Sheetのプロパティ names で、全ての名前の定義が取得できます。
import xlwings as xw
# エクセルの非表示を設定
xw.App(visible=False)
# 既存のBOOKを開く
book = xw.Book('.\\xlwings.xlsx')
# 左から数えて2番目のシートを選択
sheet = book.sheets[1]
# type(sheet.names) class 'xlwings.main.Names' ※xlwings.main.Nameのコレクション
print(sheet.names) # [Name 'Sheet2!name_sheet2': =Sheet2!$C$7:$D$7]
print(sheet.names.count) # 1
セルの値の取り出し方
クラス xlwings.main.Namesの各要素に「名前の定義」のインスタンス(クラス xlwings.main.Name)があるので、そこから値を取り出します。
# type(sheet_name) class 'xlwings.main.Name'
sheet_name: xlwings.main.Name = sheet.names[0]
# シートのセルの値の取り出し
print(sheet_name.refers_to_range.value) # ['s2-c', 's2-d']
シートにある定義の値を出力するものはこのようになります。
sheet = book.sheets[1]
for sheet_name in sheet.names:
print(sheet_name.refers_to_range.value)
クラス xlwings.main.Nameのプライオリティ一覧
このクラスが定義された名前の「範囲」の制御を行っています。
- 定義された名前
-
sheet_name.name # Sheet2!name_sheet2
- 名前が参照するRangeを定義している数式 A1形式
-
sheet_name.refers_to # =Sheet2!$C$7:$D$7
- Rangeオブジェクト
-
sheet_name.refers_to_range # Range [xlwings.xlsx]Sheet2!$C$7:$D$7
名前の範囲がブックの場合のセルの値の取得方法
「範囲」がブックのものは、クラス xlwings.main.Bookから取り出せます。
import xlwings as xw
# エクセルの非表示を設定
xw.App(visible=False)
# 既存のBOOKを開く
book = xw.Book('.\\xlwings.xlsx')
# class 'xlwings.main.Names' xlwings.main.Nameのコレクション
print(book.names) # [, , ]
ここから後の値取得は、範囲がシートのものと同じです。
for book_name in book.names:
print(book_name.refers_to_range.value)
但し、print(book.names)によってコンソール出力されたもので分かる通り、book.namesに格納されている「名前の定義」は、ブック内の全てです。つまり、範囲がシートのものを含みます。
参考サイト
xlwingsの公式サイトです。海外の掲示板で、「範囲がブックのものはどうやってとるの?」と質問があったので、書きました。
コメント