YutaKaのPython教室

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

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

xlwingsを使用すると、Excelを開きながら、PythonでExcelを操作することができます。

例えば、

  • 細かい変更は手作業でExcel操作
  • 自動化できる作業はPythonで実行

というように、ExcelとPythonを並行して、インタラクティブに操作できます。

今回は、特にインタラクティブな操作感が強いアクティブシートの操作を紹介します。

例えば、画面左側にExcel、右側にpythonを開いて、Excel操作とPython実行を並行して行えます!

これこそ、Python使いが待ち望んでいた次世代のExcelの使い方かもしれませんね。

 

xlwings便利な使い方

xlwingsの便利な使い方としては次のようなものがあります:

  • アクティブブック内のアクティブシートを操作
  • ブック、シートオブジェクトを作成して操作(Pythonでクロ作成など)
  • Excel用の関数をPythonで作成

今回は、1つ目のアクティブシートの操作を紹介していきます。

  • アクティブブックの確認・指定
  • アクティブシートの確認・指定
  • セルの操作(読み書き)

の順番に解説していきます。

xlwingsのインストール

xlwingsは組み込みライブラリではないので、pipまたはcondaでインストールします。

pip install xlwings
conda install xlwings

ブックの基本操作|開く・保存・閉じる

xlwingsではブック(Excelファイル)をBookオブジェクトとして扱います。

まずは、ブックの基本操作として、

  • 新規ブックの作成:Book()
  • 既存ブックの読み込み:Book("path")
  • ブックの保存:wb.save()
  • ブックを閉じる:wb.close()

について見ていきましょう。

新規ブックの作成:xw.Book()

Bookオブジェクトを作成すると、新規ブックが作成され、Excelが自動で起動します

import xlwings as xw
    
wb = xw.Book()

既存ブックの読み込み:xw.Book(path)

既存のブックを読み込むには、Bookクラスにブックのパスを渡します。

path = "existingbook.xlsx"
wb = xw.Book(path)

ブックの保存:wb.save("savedbook.xlsx")

ブックを保存するには、Bookオブジェクトのsave()メソッドを使用します。

名前を付けて保存する場合には、引数に保存先のパス、ファイル名を指定します。

wb = xw.Book()
 
# カレントディレクトリに保存する
path = "_savedbook.xlsx"
wb.save(path)
 
# 親ディレクトリに保存する例
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()  # ブックを閉じる

アクティブブックの確認・指定方法

xlwingsには、アクティブブックのアクティブシートを簡単に操作する機能があります。

アクティブブックというのは、だいたいの場合

  • 一番最後に操作したブック
  • 画面上で一番前に出ているブック

です。

アクティブブックを取得:xw.books.active

Python上でアクティブブックを取得するには、books.aciveを指定します。

例えば、Book1とBook2を開いているとして、アクティブブックを確認してみましょう。

# 開いているブックの確認(booksコレクションを出力)
print(xw.books)
# Books([<Book [Book1.xlsx]>, <Book [Book2.xlsx]>])
 
# アクティブブックの取得
wb = xw.books.active
print(wb.name) # name属性で名前を出力
# Book1.xlsx

この例ではBook1がアクティブでした。この後Book2を操作するとBook2がアクティブになります。

アクティブブックの指定:wb.activate()

基本的には、最後に操作したブックがアクティブになります。

  • ブックをマウス操作、キーボード操作
  • wb = xw.Book()で新規作成
  • wb = xw.Book("path")で既存ブックを読み込み

等の操作をするとブックがアクティブになります。

Python上でブックを明示的にアクティブにしたい場合には、Bookオブジェクトのactivate()メソッドを使用します。

次の例では2つのブックを読み込んだ後に、明示的にアクティブシートを変更しています。

# 既存ブック⇒上書き保存
wb1 = xw.Book("existingbook.xlsx")
wb2 = xw.Book("existingbook2.xlsx")
 
print(xw.books.active.name)
# existingbook2.xlsx
 
wb1.activate()
print(xw.books.active.name)
# existingbook.xlsx

アクティブブックがexistingbook2.xlsxからexistingbook.xlsxに変更されていますね。

アクティブシートの確認・指定方法

アクティブブックと同様に、基本的には最後に操作したシートがアクティブになります。

  • シートをマウス操作、キーボードで変更
  • sht = xw.sheets.add()でシートを追加

するとアクティブになります。

Excelの画面上では、アクティブシートが前面に表示されているのですぐわかります。

アクティブシートを取得:xw.sheets.active

Python上でアクティブシートを取得するには、sheets.aciveを指定します。

アクティブブックにsheet1とsheet2があるとして、アクティブシートを確認してみます。

# ブック内シートの確認
print(xw.sheets)
# Sheets([<Sheet [Book1]Sheet1>, <Sheet [Book1]Sheet2>])
  
# アクティブシートの確認
sht = xw.sheets.active
print(sht.name)
# Sheet1

この例ではSheet1がアクティブでした。

この後Sheet2を操作するとSheet2がアクティブになります。

アクティブシートの指定:sht.activate()

Python上で、シートをアクティブにしたい場合には、sheetsオブジェクトのactivate()メソッドを使用します。

# ブック内シートの確認
print(xw.sheets)
# Sheets([<Sheet [Book1]Sheet1>, <Sheet [Book1]Sheet2>])
  
# アクティブシートの確認
print(xw.sheets.active.name)
 
# アクティブシートの変更
sht = xw.sheets["Sheet2"]
sht.activate()
print(xw.sheets.active.name)

アクティブシートがSheet1からSheet2に変更されていますね。

セルのデータの読み書き:xw.Range().value

アクティブシートのセルにアクセスには、Range()クラスを生成します。

特定のセルにアクセスするには、次の2つの方法があります。

  • "セル番地"でアクセス:xw.Range("A1")
  • (行番号,列番号)でアクセス:xw.Range(1,1)

また、セル範囲にアクセスする場合には、次のように記述します。

  • "セル番地"でアクセス:xw.Range("A1:C4")
  • (行番号,列番号)でアクセス:xw.Range((1,1), (3,4))

以下では、セル番地を使用する例で値の書き込み、読み込み方法を見ていきます。

データの書き込み

セルにデータを書き込むには、Range()オブジェクトのvalue属性に直接入力します。

xw.Range("A1").value = "Hello World!"

リストを渡すと、指定したセルを始点に行方向にデータを入力します。

xw.Range("C3").value = ["Apple", "Banana", "Carotte"]

列方向に入力する場合は、transpose=Trueを指定します。

xw.Range("B2", transpose=True).value = [10, 20, 30]

リスト内リストを与えると、表形式のデータを入力できます。

xw.Range("A1").value = [["Apple", "Banana", "Carotte"],
                        ["10", "20", "30"]]

データの読み込み

セルのデータを読み込むには、Range()オブジェクトのvalue属性を参照します。

次のExcelを例にデータを読み込んでみましょう。

まずは、単一セルのデータを読み込んでみます。

print(xw.Range("A1").value)
# Apple

セル範囲を指定すると、範囲内のデータがリストで返されます。

print(xw.Range("A1:B2").value)
# [['Apple', 'Banana'],
#  [10.0, 20.0]]

Range().extend()メソッドを使用すると、指定したセルを基準にアクセス範囲を広げることができます。

  • Range().extend('right'):行方向に拡張
  • Range().extend('down'):列方向に拡張
  • Range().extend('table'):表全体に拡張

Range().extend('right')で、行方向にアクセス範囲を拡張します。

print(xw.Range("A1").expand('right').value)
# ['Apple', 'Banana', 'Carotte']

Range().extend('down')で、列方向にアクセス範囲を拡張します。

print(xw.Range("A1").expand('down').value)
# ['Apple', 10.0, 20.0]

Range().extend('talbe')で、表形式でアクセス範囲を拡張します。

print(xw.Range("A1").expand('table').value)
# [['Apple', 'Banana', 'Carotte'],
#  [10.0, 20.0, 30.0],
#  [20.0, 40.0, 60.0]]

これでPythonからExcelを読み書きできるようになりました。

アイデア次第で息をするようにExcelの自動化ができるようになるかもしれません。

おわりに

今回は、アクティブシートの操作を紹介しました!

ExcelとPythonを並行して、インタラクティブに操作できます。

これこそ、Python使いが待ち望んでいた次世代のExcelの使い方かもしれませんね。

ブックやシートのさらに詳しい操作方法はこちらの記事にまとめています。

このシリーズでは、xlwingsの操作方法を紹介していますが、pythonでExcelを操作する選択肢は他にもあります。

 

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

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

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