xlwings
を使用すると、Excelを開きながら、PythonでExcelを操作することができます。
例えば、
- 細かい変更は手作業でExcel操作
- 自動化できる作業はPythonで実行
というように、ExcelとPythonを並行して、インタラクティブに操作できます。
今回は、特にインタラクティブな操作感が強いアクティブシートの操作を紹介します。
例えば、画面左側にExcel、右側にpythonを開いて、Excel操作とPython実行を並行して行えます!
これこそ、Python使いが待ち望んでいた次世代のExcelの使い方かもしれませんね。
- xlwings便利な使い方
- xlwingsのインストール
- ブックの基本操作|開く・保存・閉じる
- アクティブブックの確認・指定方法
- アクティブシートの確認・指定方法
- セルのデータの読み書き:xw.Range().value
- おわりに
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を操作する選択肢は他にもあります。
- Excelファイルを開かずにPythonで操作したい場合にはopenpyxlがおススメ
- データ分析を行う場合には
pandas
で直接Excelを読み込む方が便利!
状況によって便利なライブラリは変わってきますので、柔軟に使用していきましょう!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!