YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

【図解!】xlwingsの使い方 | pythonでExcelを操作②ブック操作編

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.booksprint()関数に渡すと、全ての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

ブック名を取得するには、namefullnameプロパティを参照します。

  • 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.sheetsSheetsオブジェクトを参照、ブック内のシートにアクセスできます。

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を操作する選択肢は他にもあります。

 

状況によって便利なライブラリは変わってきますので、柔軟に使用していきましょう!

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!