YutaKa Notebook | Python徹底図解ブログ!

Python の文法やモジュール、Python関連のAPIについて画像・ソースコード付きで徹底解説!

【図解!】xlwingsの使い方 | pythonでExcelを操作③シート操作編

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.sheetsSheetsが自動で生成されます。
(この記事では、Bookインスタンスをwbと記述して説明していきます。)

Sheetsオブジェクトのメソッド、プロパティで

  • ブック内のSheetオブジェクトの参照:wb.sheets
  • 新規シートの追加:wb.sheets.add()
  • アクティブシートの取得:wb.sheets.active

を行うことができます。

Sheetオブジェクトの取得:wb.sheets

wb.sheetsprint()関数に渡すと、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を操作する選択肢は他にもあります。

 

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

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

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