openpyxlでエクセルファイルを編集しているんだけど、
最後にシートをグループ化する必要がある…。
openpyxlでグループ化をする方法は無いの?
なるほど…。
では今回は、「openpyxlでシートをグループ化する方法」を
できるだけわかりやすく解説いたします。
また、「グループ化解除の方法」や「行や列をグループ化する方法」
も紹介いたしますので、ぜひ最後まで読んでいってください。
openpyxlでシートをグループ化する方法
「sheet_view」の「tabSelected」を使います。まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']
ws3 = wb['Sheet3']
ws1.sheet_view.tabSelected = True
ws2.sheet_view.tabSelected = True
ws3.sheet_view.tabSelected = True
wb.save('output.xlsx')
ws1.sheet_view.tabSelected = True
ws2.sheet_view.tabSelected = True
ws3.sheet_view.tabSelected = True
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
シートの取得
まずはグループ化するシートを取得します。
今回は、「Sheet1」~「Sheet3」までグループ化するため、3つのシートを取得しています。
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']
ws3 = wb['Sheet3']
シートの取得方法の詳細は下記記事をご参考ください。
グループ化
前項で取得したシートをグループ化します。
ws1.sheet_view.tabSelected = True
ws2.sheet_view.tabSelected = True
ws3.sheet_view.tabSelected = True
取得したシートが入った変数に続けて「.sheet_view.tabSelected = True」と書きます。
これをグループ化したいシートの分だけ行えば完了です。
「Sheet1」~「Sheet3」までがグループ化されていることがわかります。
openpyxlでシートのグループ化を解除する方法
今度はシートのグループ化を解除する方法を見ていきましょう。
前項でグループ化した「Sheet1」~「Sheet3」を解除してみます。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']
ws3 = wb['Sheet3']
ws1.sheet_view.tabSelected = False
ws2.sheet_view.tabSelected = False
ws3.sheet_view.tabSelected = False
wb.save('output.xlsx')
コードは簡単です。
前項で「True」だったところを「False」にしただけです。
これで「Sheet1」~「Sheet3」のグループ化が解除できます。
openpyxlで行・列をグループ化する方法・解除する方法
今度は行や列をグループ化する方法と解除する方法です。
まずは行をグループ化して折り畳む方法を見ていきましょう。
行をグループ化
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
ws.row_dimensions.group(2, 5, hidden = True)
wb.save('output.xlsx')
コードの6行目に注目してください。
ws.row_dimensions.group(2, 5, hidden = True)
ワークシートが入った変数に続けて「.row_dimensions.group()」を記述します。
()内にはグループ化する行を指定します。
上記コードは、2行目~5行目までをグループ化する例です。
「hidden = True」を記述すると、グループ化した行が折り畳まれた状態になります。
「hidden」を「False」にすると、グループ化した行が表示されたままになります。
では次に、列をグループ化する方法を見ていきましょう。
列をグループ化
列をグループ化するには、前項のコードの6行目を下記のように変えてください。
ws.column_dimensions.group('B', 'E', hidden=True)
グループ化する列の指定は、アルファベットで行ってください。
「hidden」の性質は行をグループ化する時と同じです。
行のグループ化を解除
行のグループ化を解除するには、下記コードを実行してください。
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
for row in range(2, 6):
ws.row_dimensions[row].outlineLevel = 0
ws.row_dimensions[row].hidden = False
wb.save('output.xlsx')
コードの6~8行目で行のグループ化を解除することができます。
7行目でグループ化を解除し、8行目で非表示を解除(再表示)しています。
それをfor文でエクセルの2~6行目に適用しています。
for文については下記記事をご参考ください。
列のグループ化を解除
列のグループ化解除は、行の時より少し複雑です。
※数字を列のアルファベットに変換するため
import openpyxl
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet1']
for col in range(2, 5):
col_letter = openpyxl.utils.get_column_letter(col)
ws.column_dimensions[col_letter].outlineLevel = 0
ws.column_dimensions[col_letter].hidden = False
wb.save('output.xlsx')
行のグループ化解除を行った時より、7行目が追加されています。
これは変数「col」に入った数字を列のアルファベットに変換する記述です。
指定が2~5なので、B列~E列のグループ化が解除されます。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
list index out of range
規定を超える部分を操作しようとした時に出るエラーです。
今回の場合では、実際にないSheet3(シート番号2)などを指定した場合にも起こります。
ファイルとコードを再確認しましょう。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでシートや行・列をグループ化する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!