akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python Excelの書き込み、シートの編集方法

はじめに

ここでは、Excelファイルを新規作成してセルに値を書き込む手順や、シートの追加、削除、シート名の変更方法をサンプルコードを用いて説明します。

読み込み手順や必要なモジュールについて

読み込み手順や必要なモジュールについては、こちらの記事で紹介しています。
akuruhinode.hatenablog.com

バージョン情報

本記事のサンプルコード作成時のバージョン情報は以下の通りです。

python : 3.8.3
openpyxl : 3.0.4

基本的な手順

基本的な流れは以下の通りです。この手順では新規Excelファイルを作成しますが、既存のExcelファイルに書き込む場合も手順2以外は同じです。

f:id:akuruhinode:20210130231847j:plain
Excelファイルの書き込み手順

上記手順のコードは以下の通りです。

import openpyxl # 1.モジュールをインポートする

wb = openpyxl.Workbook()  # 2.新規Workbookオブジェクトを作成する

# デフォルトで'Sheet'というシートが追加されている
# print(wb.sheetnames)
# ['Sheet']

ws= wb['Sheet'] # 3.操作するシートを指定する

ws['A1'] = 'test' # 4.セルに値を書き込む

wb.save('sample.xlsx') # 5.Excelファイルを保存する

以下は作成したExcelファイルです。コメントにもある通り、新規Workbookを作成した時点で'Sheet'という名称のシートが追加されています。

f:id:akuruhinode:20210203163622j:plain
作成したExcelファイル

シートの編集方法

シートの追加

シートを追加するコードは以下の通りです。ここでは、先ほど作成したExcelファイルにシートを追加してみます。

import openpyxl
wb = openpyxl.load_workbook('sample.xlsx')

ws = wb.create_sheet() # シートの追加。追加したWorksheetオブジェクトを返す

# create_sheet()の引数を指定しないとシート名は自動設定され、既存シートの末尾に追加される
# 引数を指定することで追加するインデックス、シート名を指定可能
# ws= wb.create_sheet(index=0, title='Sheet name') 

ws['A1'] = 'test2'

wb.save('sample.xlsx')

シート追加後のExcelファイルは以下の通りです。コメントにもある通り、create_sheet()の引数を指定していないため'Sheet1'という名前のシートが自動で追加されました。

f:id:akuruhinode:20210203163507j:plain
シート追加後のExcelファイル

シートの削除

シートを削除するコードは以下の通りです。ここでは、先ほど作成したファイルから'Sheet'を削除してみます。

シートの削除方法は二通りあります。Workbookオブジェクトのremove()メソッドを利用するか、del文を利用します。

import openpyxl
wb = openpyxl.load_workbook('sample.xlsx')

wb.remove(wb['Sheet']) # 既存シートを削除
# 以下のようにdel文でも削除可能
# del wb['Sheet']

wb.save('sample.xlsx')

以下はシート削除後のExcelファイルです。指定したシートが削除できていることがわかると思います。

f:id:akuruhinode:20210203163310j:plain
シート削除後のExcelファイル

シートのコピー

シートをコピーするコードは以下の通りです。

import openpyxl
wb = openpyxl.load_workbook('sample.xlsx')
# print(wb.sheetnames)
# ['Sheet2']

ws = wb.active
wb.copy_worksheet(ws)
# 'コピー元のシート名 Copy'がシート名に設定される
# print(wb.sheetnames)
# ['Sheet2', 'Sheet2 Copy']

wb.save('sample.xlsx')

以下はコピー後のExcelファイルです。

f:id:akuruhinode:20210203162848j:plain
シートコピー後のExcelファイル

シート名の変更

シート名はWorksheetオブジェクトのtitle属性から変更できます。上記に続き、先ほど作成したファイルの'Sheet1'の名称を変更してみます。

import openpyxl
wb = openpyxl.load_workbook('sample.xlsx')

ws= wb['Sheet1']

sheet.title = 'Sheet2' # シート名の変更

wb.save('sample.xlsx')

以下はシート名変更後のExcelファイルです。

f:id:akuruhinode:20210203163116j:plain
シート名変更後のExcelファイル
例外発生に注意

禁則文字(シート名に含めることができない文字)を指定した場合、ValueErrorが発生します。

シート名の重複に注意

既存シート名と同じシート名を指定した場合、末尾に自動で数字が追加されます。

import openpyxl
wb = openpyxl.Workbook()
print(wb.sheetnames)

new_sheet_name = wb.active.title  # 既存シート名'Sheet'を指定
wb.create_sheet(title=new_sheet_name)
print(wb.sheetnames)
['Sheet']
['Sheet', 'Sheet1']

エラーは発生しないのでプログラムが止まることはないのですが、想定通りの動作にならない可能性があるため注意が必要です。
以下のようなシート名の存在チェックを入れておくと安全でしょう。

import openpyxl
wb = openpyxl.Workbook()

new_ws_name = wb.active.title #実際には追加するシート名に置き換える

if new_ws_name in wb.sheetnames:
    print('同じシート名が既に存在します')
else:
    wb.create_sheet(title=new_ws_name)