pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、シートの移動に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。
左から順に「001」「002」「003」~「010」という名前のシートを持つ
ブック「テスト」があると仮定して、シート「005」を移動させたいとします。
Workbook.move_sheetメソッド
wb.move_sheet(シート名, offset=移動する値)
上記のように記述すると
現在のシートの位置を基準にoffsetの引数の数だけ移動してくれます。
ちなみに、「offset=1」だったら右へ一つ分。「offset=-1」であれば左へ一つ分移動します。
from openpyxl import load_workbook
wb = load_workbook('テスト.xlsx')
wb.move_sheet('005', offset=-1)
wb.save('テスト_移動後.xlsx')
末尾へ移動
上記の応用で今度は末尾へシートを移動させます。
今回は、順番も総シート数も解っているので「offset=5」にすればいいだけなのですが
それだと味気ないので、ちょっと工夫してみます。
先日復習していたlen関数を使って移動を試みます。
from openpyxl import load_workbook
wb = load_workbook('テスト.xlsx')
wb.move_sheet('005', offset=len(wb.sheetnames))
wb.save('テスト_末尾へ移動後.xlsx')
エラー出るかなと不安でしたが、しっかり移動してくれました。
これで、100シートとかあっても怖くない!
先頭へ移動
こちらも、末尾へ移動同様
「005」シートがどこにあっても先頭へ移動させれるように工夫してみます。
「005」シートがどこにあるのかわからないので
先ずは「005」シートの位置を知るために、Workbook.indexメソッドを使ってみます。
Workbook.indexメソッド
wb.index(シート)
で、シートの数(インデックス番号)を取得できます。
後は、シート数分だけ左に移動するだけです。
from openpyxl import load_workbook
wb = load_workbook('テスト.xlsx')
ws_005 = wb['005']
wb.move_sheet('005', offset=-wb.index(ws_005))
wb.save('テスト_先頭へ移動後.xlsx')
これで、先頭に移動してくれた!・・・のですが
ブックを開いて確認してみると何か違和感が・・・。
「005」「001」のシートが選択されている状態なのです。
こちらは原因と対処法が解りましたら追記いたします。
追記:グループ解除
上記の「005」「001」のシートが選択されている状態になった原因ですが
もともとブックで選択されていたシートが「001」だったためのようでした。
対処法としては
一旦グループ選択状態を解除して、再度先頭のシートを選択しなおす
と、良いようです。
from openpyxl import load_workbook
wb = load_workbook('テスト.xlsx')
ws_005 = wb['005']
wb.move_sheet('005', offset=-wb.index(ws_005))
# シートのグループ選択を解除する
for ws in wb.worksheets:
ws.sheet_view.tabSelected = None
# 再度先頭のシートを選択状態にする
wb.active = 0
wb.save('テスト_先頭へ移動後.xlsx')
こちらで、先頭のシートのみが選択状態にする事が出来ました!