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