xlwingsを使用すると、Excelを開きながら、PythonでExcelを操作することができます。
xlwingsでは、シートやブック、セルなどは全てオブジェクトとして扱います。
今回は、Sheetオブジェクトの基本操作について紹介します。
xlwings便利な使い方
xlwingsの便利な使い方としては次のようなものがあります:
- アクティブブック内のアクティブシートを操作
- ブック、シートオブジェクトを作成して操作(Pythonでマクロ作成など)
- Excel用の関数をPythonで作成
どの使い方でも、ブック、シート、セルを自由に操作できることが重要です!
今回は、Sheetオブジェクトの基本操作を紹介していきます。
Bookオブジェクトについては、こちらの記事でまとめています。
Sheetオブジェクトの基本的な考え方
シートはSheetオブジェクトとして取り扱われます。
このとき:
- 各シートは、それぞれ
Sheetオブジェクトとして扱われる - 全ての
Sheetオブジェクトは、Sheetsオブジェクトに所属する
ことになります。
Sheetsオブジェクトは、Sheetのコレクションです。
(コレクション=オブジェクトをまとめているオブジェクト)
Sheetsオブジェクト、Sheetオブジェクトの基本操作について見ていきましょう!
Sheetsオブジェクトの操作
Sheetsオブジェクトは、Sheetオブジェクトのコレクションです。
(コレクション=オブジェクトをまとめているオブジェクト)
Excelではブックを開くとシートが自動で生成されますね。
同様に、Bookオブジェクトを生成すると、wb.sheetsにSheetsが自動で生成されます。
(この記事では、Bookインスタンスをwbと記述して説明していきます。)
Sheetsオブジェクトのメソッド、プロパティで
- ブック内の
Sheetオブジェクトの参照:wb.sheets - 新規シートの追加:
wb.sheets.add() - アクティブシートの取得:
wb.sheets.active
を行うことができます。
Sheetオブジェクトの取得:wb.sheets
wb.sheetsをprint()関数に渡すと、wb内の全Sheetオブジェクトを確認できます。
Sheet1とSheet2を持つブックで、wb.sheetsを確認してみましょう。
wb = xw.Book("Book1")
print(wb.sheets)
# Sheets([<Sheet [Book1]Sheet1>, <Sheet [Book1]Sheet2>])
特定のシートを参照したい場合には、インデックスまたはシート名で指定します。
インデックスは、各シートの固有の番号で0から始まります。
シート名、インデックスそれぞれでSheetを取得してみます。
wb = xw.Book("Book1")
sht = wb.sheets[0]
print(sht.name)
sht = wb.sheets["Sheet2"]
print(sht.name)
Sheetオブジェクトを変数shtに格納して、nameプロパティでシート名を表示しています。
アクティブブックのSheetsオブジェクトは、ブックを指定する必要がなく
xw.sheets
だけで参照することができます。
Bookをわざわざ指定しなくて良いので、少し楽です。
xw.Book("Book1").activate() #ブックをアクティブ化
print(xw.sheets)
# Sheets([<Sheet [Book1]Sheet1>, <Sheet [Book1]Sheet2>])
アクティブブックを操作する際に便利ですね。
新規シートの追加:sheets.add()
sheets.add()メソッドで新規シートを作成、コレクションに追加することができます。
- 引数でシート名を指定可能 ⇒
sheets.add("sheet_name") - 引数を省略 ⇒ デフォルト名(Sheet1, Sheet2, …)が設定
sheets.add()メソッドは作成した新規シートのオブジェクトを返します。
新規シートを追加してみましょう。
wb = xw.Book()
print(wb.sheets)
# Sheets([<Sheet [Book1]Sheet1>])
# デフォルト名で追加
sht = wb.sheets.add()
print(wb.sheets)
# Sheets([<Sheet [Book1]Sheet2>, <Sheet [Book1]Sheet1>])
# シート名を指定して追加
sht = wb.sheets.add("added_sheet")
print(wb.sheets)
# Sheets([<Sheet [Book1]added_sheet>, <Sheet [Book1]Sheet2>, <Sheet [Book1]Sheet1>])
SheetsにSheet2(デフォルト名)、added_sheetが追加されていますね。
アクティブシートの取得:sheets.active
activeプロパティを参照すると、現在アクティブなシートを返します。
アクティブシートは、Excelの画面上で前面に表示されているシートです。
Sheet2をアクティブ化して、アクティブシートを出力してみます。
print(wb.sheets)
# Sheets([<Sheet [Book1]added_sheet>, <Sheet [Book1]Sheet2>, <Sheet [Book1]Sheet1>])
# Sheet2をアクティブ化する
wb.sheets["Sheet2"].activate()
# アクティブシートの参照
sht = wb.sheets.active
print(sht.name)
# Sheet2
アクティブシートを取得することができました。
これもアクティブブックを操作する際に便利です。
Sheetオブジェクトの操作
Sheetオブジェクトを操作すると、シートを操作することができます。
以下では、シートの基本操作を整理していきます。
- シート名を取得:
sht.name - 所属ブックの取得:
sht.book - シートのアクティブ化:
sht.activate() - シートの削除:
sht.delete() - シート内の値、書式の削除:
sht.clear() - 行、列の幅の調整:
sht.autofit() - セル、セル範囲の取得:
sht.range() - 使用中のセル範囲の取得:
sht.used_range()
シート名を取得:sht.name
シート名を取得するには、nameプロパティを参照します。
wb = xw.Book()
sht = wb.sheets[0]
print(sht.name)
# Sheet1
所属ブックの取得:sht.book
シートが所属するブックのオブジェクトを取得するには、bookプロパティを参照します。
wb = xw.Book("Book1")
sht = wb.sheets["Sheet1"] # Book1に所属するSheet1をsht格納
# shtが所属するブック(Book1)をbookプロパティで参照
wb_belong = sht.book
print(w_beling.name)
# Book1
Sheet1のbookプロパティで、Sheet1の所属ブック(Book1)を参照できていますね。
シートのアクティブ化:sht.activate()
アクティブシートは、Excelの画面上で前面に表示されているシートです。
Excel上では、クリックなどでシートタブを切り替えると、アクティブシートが切り替わります。
Python上でシートを明示的にアクティブにしたい場合には、
sht.activate()メソッド
を使用します。
Sheet1、Sheet2があるブックで、Sheet1をアクティブ化、シート名を出力してみましょう。
# ブックの選択
wb = xw.Book("Book1")
print(wb.sheets)
# Sheets([<Sheet [Book1]Sheet2>, <Sheet [Book1]Sheet1>])
# Sheet1のアクティブ化
wb.sheets["Sheet1"].activate()
# アクティブシートの取得
sht_active = wb.sheets.active
print(sht_active.name)
# Sheet1
アクティブシートを指定、シート名を出力することができました。
これもアクティブブックを操作する際に便利な機能です。
シートの削除:sht.delete()
シートを削除するには、delete()メソッドを使用します。
Sheet1とSheet2があるブックから、Sheet1を削除してみましょう。
wb = xw.Book("Book1")
print(wb.sheets)
# Sheets([<Sheet [Book1]Sheet2>, <Sheet [Book1]Sheet1>])
# Sheet1を削除
wb.sheets["Sheet1"].delete()
print(wb.sheets)
# Sheets([<Sheet [Book1]Sheet2>])
Sheet1が削除されましたね。
シート内の値、書式の削除:sht.clear()
シート内の値、書式を削除するには
- 値の削除:
sht.clear_contents() - 値と書式の削除:
sht.clear()
を使用します。
次のデータで、値の削除、値と書式の削除を実行してみます。
まずsht.clear_contents()メソッドで値の削除を行います。
wb = xw.Book("Book1")
sht = wb.sheets[0]
# 値のクリア(書式は保持)
# sht.clear_contents()
値のみが削除されました。
次に、sht.clear()で値と書式を削除します。
wb = xw.Book("Book1")
sht = wb.sheets[0]
# 値と書式のクリア
sht.clear()
値と書式が全てクリアされました。
行、列の幅の調整:sht.autofit()
sht.autofit()を使用すると、シートの行と列の幅を自動調整することができます。
引数で調整する対象を選択できます:
- 列の幅のみ:
sht.autofit("c")または"columns" - 行の幅のみ:
sht.autofit("r")または"rows" - 行と列両方の幅:
sht.autofit()引数を省略
次のデータで、行と列の幅を調整してみます。
まず、autofit("columns")で行の幅を調整してみます。
wb = xw.Book("Book1")
sht = wb.sheets[0]
# 列の幅を自動調整
sht.autofit("columns") # "c" or "columns"
次に、autofit("rows")で行の幅を調整してみます。
wb = xw.Book("Book1")
sht = wb.sheets[0]
# 行の幅を自動調整
sht.autofit("rows") # "r" or "rows"
最後に、sht.autofit()で行と列両方の幅を調整します。
wb = xw.Book("Book1")
sht = wb.sheets[0]
# 行と列の幅を自動調整
sht.autofit()
セル、セル範囲の取得:sht.range()
シート同様に、セルはRangeオブジェクトとして取り扱われます。
シート内のセルにアクセスするには、Rangeオブジェクトを生成します。
セルを指定するには次の2つの方法があります:
- "セル番地"でアクセス:
sht.Range("A1") - (行番号,列番号)でアクセス:
sht.Range(1,1)
また、セル範囲にアクセスする場合には、次のように記述します。
- "セル番地"でアクセス:
sht.Range("A1:C4") - (行番号,列番号)でアクセス:
sht.Range((1,1), (3,4))
次のブックを例に、セル番地でセルにアクセスする方法を紹介します。
セル範囲を取得して、valueプロパティで値を出力してみます。
# range
sht = xw.sheets.active
print(sht.range("A1"))
# <Range [cell_range.xlsx]Sheet1!$A$1>
print(sht.range("A1").value)
# A1
セル範囲を選択すると、行方向・列方向のリスト内リストの形で値を出力します。
sht = xw.sheets.active
print(sht.range("A1:B2"))
# <Range [cell_range.xlsx]Sheet1!$A$1>
print(sht.range("A1:B2").value)
# [['A1', 'B1'], ['A2', 'B2']]
単一セルに値を書き込む場合には、valueプロパティに直接代入します。
# range
sht = xw.sheets.active
sht.range("A1").value = "new_data"
A1の値が書き変わりました。
リストを渡すと、指定したセルを始点に行方向にデータを入力します。
sht = xw.sheets.active
sht.range("A1").value = ["data1", "data2", "data3"]
リスト内リストを渡すと、指定したセルを始点に表形式でデータを入力します。
sht = xw.sheets.active
sht.range("A1").value = [["data1", "data2"], ["data3", "data4"]]
リスト内リストに応じた形式でデータが入力できています。
Rangeオブジェクトの操作方法には、別の記事で紹介したいと思います。
使用中のセル範囲の取得:sht.used_range()
used_range()メソッドで、使用中のセル範囲のRangeオブジェクトを取得できます。
例えば、次の例では、A1~D3までのセルが使用されています。
sht = xw.sheets.active
my_range = sht.used_range
print(my_range)
# <Range [Book1]Sheet1!$A$1:$D$3>
次の例ではB2~D4までのセルが使用されています。
sht = xw.sheets.active
my_range = sht.used_range
print(my_range)
# <Range [Book1]Sheet2!$B$2:$D$4>
おわりに
今回は、Sheetオブジェクトの操作を紹介しました!
シートの操作にあわせて、ブック、セルの操作も抑えておきたいですね。
このシリーズでは、xlwingsの操作方法を紹介していますが、pythonでExcelを操作する選択肢は他にもあります。
- Excelファイルを開かずにPythonで操作したい場合にはopenpyxlがおススメ
- データ分析を行う場合には
pandasで直接Excelを読み込む方が便利!
状況によって便利なライブラリは変わってきますので、柔軟に使用していきましょう!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!














