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に関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!




