xlwings
を使用すると、Excelを開きながら、PythonでExcelを操作することができます。
xlwings
では、シートやブック、セルなどは全てオブジェクトとして扱います。
今回は、Book
オブジェクトの基本操作について紹介します。
xlwings便利な使い方
xlwings
の便利な使い方としては次のようなものがあります:
- アクティブブック内のアクティブシートを操作
- ブック、シートオブジェクトを作成して操作(Pythonでマクロ作成など)
- Excel用の関数をPythonで作成
どの使い方でも、ブック、シート、セルを自由に操作できることが重要です!
今回は、Bookオブジェクトの基本操作を紹介していきます。
Bookオブジェクトの基本的な考え方
xlwings
では、Excelを開きながら、そのブックをPythonでも操作します。
このとき:
- 各ブックは、それぞれ
Book
オブジェクトとして扱われる - 全ての
Book
オブジェクトは、Books
オブジェクトに所属する
ことになります。
Books
オブジェクト、Book
オブジェクトの基本操作について見ていきましょう!
Booksオブジェクトの操作
Books
オブジェクトは、Book
のコレクションです。
(コレクション=オブジェクトをまとめているオブジェクト)
Books
オブジェクトは、ブックを開いているとxw.books
に自動で生成されます。
Books
オブジェクトのメソッド、プロパティで
- 開いている全
Book
オブジェクトの取得:xw.books
- 新規ブックの追加:
xw.books.add()
- 既存ブックを開く:
xw.books.open()
- アクティブブックの取得:
xw.books.active
を行うことができます。
Bookオブジェクトの取得:xw.books
xw.books
をprint()
関数に渡すと、全てのBook
オブジェクトを確認できます。
Book1とBook2を開いて、xw.books
を確認してみましょう。
import xlwings as xw
# 新規ブックを2つ開く
wb1 = xw.Book()
wb2 = xw.Book()
print(xw.books)
# Books([<Book [Book1]>, <Book [Book2]>])
特定のブックを参照したい場合には、インデックスまたはブック名で指定します。
wb = xw.books[0]
print(wb.name)
# Book1
wb = xw.books["Book2"]
print(wb.name)
# Book2
Book
オブジェクトを変数wb
に格納して、name
プロパティでブック名を表示しています。
新規ブックの追加:xw.books.add()
add()
メソッドで新規ブックを作成、コレクションに追加することができます。
add()
メソッドは作成した新規ブックのオブジェクトを返します。
wb = xw.books.add()
print(wb.name)
# Book3
print(xw.books)
# Books([<Book [Book1]>, <Book [Book2]>, <Book [Book3]>])
Books
にBook3が追加されていますね。
既存ブックを開く:xw.books.open()
引数としてパスを渡して、既存のブックを開きます。
open()
メソッドは、開いたブックのオブジェクトを返します。
wb = xw.books.open(r"../data/existingbook.xlsx")
print(wb.name)
# existingbook.xlsx
wb = xw.books.open("existingbook2.xlsx")
print(wb.name)
# existingbook2.xlsx
フルパスではなく、ファイル名だけを渡すとカレントディレクトリ内のファイルを開きます。
アクティブブックの取得:xw.books.active
active
プロパティを参照すると、現在アクティブなブックを返します。
Book1をアクティブにしてから確認してみます。
print(xw.books)
# Books([<Book [Book1]>, <Book [Book2]>, <Book [Book3]>, ...])
# Book1をアクティブにする
xw.books["Book1"].activate()
# アクティブシートの取得
wb = xw.books.active
print(wb.name)
# Book1
アクティブブックを取得することができました。
これは、アクティブブックを操作する際に便利ですね。
Bookオブジェクトの操作
Book
オブジェクトを操作することで、ブックを操作することができます。
以下では、ブックの基本操作を整理していきます。
- 新規ブックの作成:
xw.Book()
- 既存ブックの読み込み:
xw.Book(path)
- 未保存のブックの取得:
xw.Book("ブック名")
- ブックの保存:
wb.save("savedbook.xlsx")
- ブックを閉じる:
wb.close()
- ブック名を取得:
wb.name
- ブックのアクティブ化:
wb.activate()
- シートの取得:
wb.sheets
- 選択中のセルの取得:
wb.selection
新規ブックの作成:xw.Book()
Book
オブジェクトを作成すると、新規ブックが作成され、Excelが自動で起動します。
import xlwings as xw
wb = xw.Book()
実行すると、空の新規ブックが生成されます。
既存ブックの読み込み:xw.Book(path)
既存のブックを読み込むには、Book
クラスにパスを渡します。
wb = xw.Book(r"../data/existingbook.xlsx")
print(wb.name)
# existingbook.xlsx
wb = xw.Book("existingbook2.xlsx")
print(wb.name)
# existingbook2.xlsx
フルパスではなく、ファイル名だけを渡すとカレントディレクトリ内のファイルを開きます。
未保存のブックの取得:xw.Book("ブック名")
未保存のブックは少し特殊で、まだ保存されていないのでパスを持っていません。
そのため、パスを指定してBook
オブジェクトを取得することができません。
そういった場合は、xw.Book()
の引数にブック名を指定します。
wb = xw.Book("Book1")
print(wb.name)
# Book1
ブックが保存済みかどうかは、ブックのタイトルを確認するとわかります。
- 保存済み:ブック名.xlsx
- 未保存:ブック名(.xlsxがついていない)
ブックの保存:wb.save("savedbook.xlsx")
ブックを保存するには、save()
メソッドを使用します。
名前を付けて保存する場合には、引数に保存先のパス、ファイル名を指定します。
wb = xw.Book()
# カレントディレクトリに保存する
wb.save("savedbook.xlsx")
# 親ディレクトリに保存する例
path = "..\_savedbook.xlsx"
wb.save(path)
引数を省略すると、ブックの種類によって挙動が異なります:
- 新規ブック⇒デフォルト名(Book1, Book2,…)でカレントディレクトリに保存
wb = xw.Book()
wb.save() # デフォルト名での保存になる
- 既存のブック⇒上書き保存
path = "existingbook.xlsx"
wb = xw.Book(path)
wb.save() # 上書き保存になる
ブックを閉じる:wb.close()
ブックを閉じるには、Book
オブジェクトのclose()
メソッドを使用します。
保存せずに、警告もなくブックを閉じるので実行時は注意しましょう。
wb = xw.Book()
wb.save() # ブックの保存を忘れずに!
wb.close() # ブックを閉じる
ブック名を取得:wb.name
ブック名を取得するには、name
かfullname
プロパティを参照します。
name
:ブック名のみfullname
:パスも含めたブック名(フルパス)
wb = xw.Book("existingbook.xlsx")
# ブック名のみ
print(wb.name)
# existingbook.xlsx
# パスも含めたブック名
print(wb.fullname)
# 'C:\Users\yutaka\ドキュメント\xlwings\existingbook.xlsx'
ブックのアクティブ化:wb.activate()
基本的には、最後に操作したブックがアクティブになっています。
- ブックをマウス操作、キーボード操作
wb = xw.Book()
で新規作成wb = xw.Book("path")
で既存ブックを読み込み
等の操作をすると、ブックがアクティブになります。
Python上でブックを明示的にアクティブにしたい場合には、
wb.activate()
メソッド
を使用します。
次の例では2つのブックを読み込んだ後に、明示的にアクティブシートを変更しています。
# 既存ブック⇒上書き保存
wb1 = xw.Book("existingbook.xlsx")
wb2 = xw.Book("existingbook2.xlsx")
print(xw.books.active.name)
# existingbook2.xlsx # wb2を後から読み込んだので、wb2がアクティブ
wb1.activate() # ここで、wb1をアクティブ化
print(xw.books.active.name)
# existingbook.xlsx
アクティブブックがexistingbook2.xlsxからexistingbook.xlsxに変更されていますね。
シートの取得:wb.sheets
ブック同様に、シートはsheet
オブジェクトとして取り扱われます。
このとき:
- 各シートは、それぞれ
Sheet
オブジェクトとして扱われる - 全ての
Sheet
オブジェクトは、Sheets
オブジェクトに所属する
ことになります。
Sheets
オブジェクトは、Sheet
のコレクションです。
(コレクション=オブジェクトをまとめているオブジェクト)
wb.sheets
でSheets
オブジェクトを参照、ブック内のシートにアクセスできます。
Sheet1、Sheet2を持ったブックを例にsheets
を表示します。
wb = xw.books.active
sht = wb.sheets
print(sht)
# Sheets([<Sheet [Book1]Sheet1>, <Sheet [Book1]Sheet2>])
print(sht[0].name)
# Sheet1
print(sht[1].name)
# Sheet2
シートの操作については、次の記事にまとめています。
選択中のセルの取得:wb.selection
ブック同様に、セルはRange
オブジェクトとして取り扱われます。
Book
オブジェクトには、選択中のセルを取得する特別なプロパティがあります。
wb.selection
:選択中のセルのRange
オブジェクトを取得
セルA1を選択した状態で、wb.selection
を取得してみます。
wb = xw.Book("Book1")
print(wb.selection)
# <Range [Book1]Sheet1!$A$1>
次にB2からD4までを選択して、wb.selection
を取得します。
wb = xw.Book("Book1")
print(wb.selection)
# <Range [Book1]Sheet1!$B$2:$D$4>
このように選択中のセルは簡単に取得することができます。
これは、アクティブブックを操作する際に便利ですね。
セルの操作については、別の記事でまとめたいと思います。
おわりに
今回は、Book
オブジェクトの操作を紹介しました!
ブックの操作ができるようになったら、次はシート、セルの操作ですね。
このシリーズでは、xlwings
の操作方法を紹介していますが、pythonでExcelを操作する選択肢は他にもあります。
- Excelファイルを開かずにPythonで操作したい場合にはopenpyxlがおススメ
- データ分析を行う場合には
pandas
で直接Excelを読み込む方が便利!
状況によって便利なライブラリは変わってきますので、柔軟に使用していきましょう!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!