【Python】openpyxlでのシート名の指定

テーマはopenpyxlではシート名の大文字小文字の区分 pythonの話

Excelファイルをpythonで読み書きできるopenpyxl

PythonにはExcelファイルを読み込んだり、Excelファイルに書き込んだりできるopenpyxlというライブラリがあります。

ExcelファイルをCSVにせずにそのままpythonで読み込めるので、普段Excelでデータの加工などしているときには非常に便利です。

openpyxlは、他のライブラリと同様に「pip install openpyxl」でインストールできます。

今回は、このopenpyxlでのシート名の指定での備忘です。

エクセルの仕様として、シート名は大文字小文字は区別しない。

pyopenxlの話の前に、Excelの仕様について確認しておきます。

Excelの仕様としてシート名では大文字と小文字は区分しません。

例えば、「test」というシートがあるときに「TEST」や「Test」というシートは追加できません。
同じ名前を付けようとするとエラーになります。

excelで同名のシートはエラーになる
大文字と小文字は区別されずエラーになります

VBAでシート名を変更するときも同様に大文字小文字を区分せずに同じシート名の場合は、エラーになります。

処理するシート名を指定するときもシート名の大文字と小文字は区別しません。

「test」というシートがあるときに、VBAのマクロで「TEST」というシート名を指定すると、「test」シートが指定されます。

Sub test()
Dim a
a = Worksheets("TEST").Cells(2, 1)
MsgBox a
End Sub

'testシートのA2セルの内容がメッセージボックスに表示されます。

以上のように、Excelでは首尾一貫してシート名の大文字と小文字は区別されません。

openpyxlの場合のシート名の大文字と小文字

openpyxlでのシートの追加

openpyxlでは、「create_sheet」でシートの追加ができます。

import openpyxl
f_path = "test.xlsx"
sheet_name = "TEST"
'ファイルを開く
wb = openpyxl.load_workbook(f_path, data_only=True)
’シートを先頭に追加する
wb.create_sheet(index=0, title=s_name)

このときに、すでにあるシート名でファイルを作成しようとするとどうなるか?

openpyxlでは、すでにあるシート名を指定した場合はエラーにならず、末尾に数字をつけて新規作成されます。
このときに同じシート名があるかは大文字と小文字は区別しません。

「test」シートがあるときに「TEST」を追加しようすると、TEST1というシートが作成されます。

同じように「test」、「TEST1」があるときにTestを追加すると、「Test2」というシートが作成されます。

Excelではシート名では大文字小文字を区別しないので、openpyxlではこれに合わせて大文字小文字を区別しない場合に同じ名前になるシートは作成できませんが、エラーとはならず末尾に数字をつけてシートが作成されます。

openpyxlで処理するシートを指定する場合

openpyxlで処理するシートを指定する場合には、大文字と小文字が区別されます。

次のコードは「test.xlsx」というファイルを開いて「TEST」というシートのA1セルに”aaa”を入力するコードです。

import openpyxl
f_path = "test.xlsx"
sheet_name = "TEST"
'ファイルを開く
wb = openpyxl.load_workbook(f_path, data_only=True)
’TESTシートのA1セルに書き込む
wb[s_name].cell(1, 1).value = "aaa"

コードではシート名を「TEST」と大文字で指定しています。

このときに、対象のブックに小文字でtestというシートがある場合はエラーとなってしまいます。

つまり、処理の対象のシートを指定するときは、大文字と小文字が区別されます。
対象のブックにあるシート名が「test」と小文字の場合には、openpyxlでも「test」と小文字で指定する必要があります。

VBAのコードでは大文字小文字区別せずにシート名を指定できましたが、openpyxlでは大文字小文字を区別するので違いに注意が必要です。

まとめ

まとめると以下のようになっています。

VBAの場合は、シートの作成時、処理でのシート名の指定のいずれも大文字小文字を区別しない。
同じシート名を追加しようとするとエラーになる。

openpyxlの場合は、シート作成時は既存のシートとの競合の判定では大文字小文字を区別しない。シート名が競合する場合は指定した大文字小文字の通りで末尾に数字をつけてシートが作成される。
処理対象のシート名を指定するときは大文字小文字が区別されシート名通りの大文字小文字で指定しないとエラーとなる。

仕様がVBAとは少し違うので注意が必要です。

コメント

タイトルとURLをコピーしました