xlwingsでエクセルファイルを編集しているんだけど、
データをまとめるために新しいシートを追加したい…。
なるほど…。
では今回は、「xlwingsで新しいシートを追加する方法」を
できるだけわかりやすく解説いたします。
xlwingsでエクセルファイルに新しいシートを追加するには
「add」を使います。まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import xlwings
workbook = xlwings.books.active
active_sheet = workbook.sheets.active
workbook.sheets.add(name='新しいシート')
workbook.sheets.add(name='新しいシート')
xlwingsの処理は、予想以上に時間がかかることがあります。
プログラムの最後に「print(‘実行完了’)」などを追記し、完了したのを確認してから結果を見ましょう。
事前準備
- xlwingsのインストール
エクセルファイルを実際に操作するには、「xlwings」のインストールが必要になります。
xlwingsのインストール方法
xlwingsを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install xlwings
※xlwingsを使用したことがある場合は、このインストール作業は不要です。
インストール方法詳細やインストールができない場合の対処法、
基本的な使い方などは下記記事をご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~シートの取得
import xlwings
workbook = xlwings.books.active
active_sheet = workbook.sheets.active
上記コードにて、「xlwingsのインポート」「アクティブブック・アクティブシートの取得」をしています。
詳細は「アクティブシートの取得」の記事をご覧ください。
新しいシートの追加
workbook.sheets.add(name='新しいシート')
上記一文にて、新しいシートを追加することができます。
【 コードの解説 】
「取得したブックが入った変数」に続けて「.sheets.add()」を記述します。
()内には「name=」の後に「新しく追加するシートの名前」を書いて完了です。
<テンプレ>
【 ブックが入った変数.sheets.add(name=‘新しく追加するシートの名前‘) 】
新しいシートは、アクティブシートの前に追加されます。
新しいシートをアクティブシートの後ろに追加したい場合はどうしたらいいのでしょうか。
新しいシートを指定したシートの後ろに追加
新しいシートを、指定したシートの後ろに追加したい場合は、下記のように記述します。
workbook.sheets.add(name='新しいシート', after=active_sheet)
()内に「after=シート変数」を追記することで、「シート変数」に紐付いたシートの後ろに新しいシートを追加できます。
新しいシートを一番後ろ(最後尾)に追加
一番後ろ(最後尾)に新しいシートを追加したい場合は、下記のように記述します。
import xlwings
workbook = xlwings.books.active
last_sheet = workbook.sheets[-1]
workbook.sheets.add(name='新しいシート', after=last_sheet)
コードの3行目で末尾のシート(マイナス1番目のシート)を取得します。
あとは前項と同様に、4行目でその末尾シートの後ろに新しいシートを追加して完了です。
新しいシートを一番前(先頭)に追加
新しいシートを一番前(先頭)に追加したい場合は、下記のように記述してください。
import xlwings
workbook = xlwings.books.active
first_sheet = workbook.sheets[0]
workbook.sheets.add(name='新しいシート', before=first_sheet)
コードの3行目で先頭のシート(0番目のシート)を取得します。
4行目でその先頭シートの前(before)に新しいシートを追加しています。
新しく追加したシートの名前が既に存在していた場合
下記のコードを見てください。
import xlwings
workbook = xlwings.books.active
workbook.sheets.add(name='1')
「1」という名前のシートを新しく追加するコードですが、既に「1」というシートが存在しています。
つまり、シート名が重複するということになります。
この状態で実行したらどうなるのでしょうか?
実行してみましょう。
エラーが出ました。
同じ名前のシートを追加することはできないようです。
新しく追加したシートを編集するには
新しく追加したシートを編集する場合は、新しいシートを変数に入れてから編集しましょう。
アクティブシートを取得した時と同様です。
new_sheet = workbook.sheets['新しいシート']
new_sheet['A1'].value = 1
うまく動作しない時
エラーが出る
Sheet named ○○ already present in workbook
これは、「○○はワークブックの中で既に存在しています」というエラーです。
既に存在しているシートの名前と、新しく追加するシートの名前が同じだった場合に起こります。
どちらかのシート名を変更しましょう。
‘NoneType’ object has no attribute ‘books’
エクセルブックやエクセルファイルを開いていないのに、ブックやファイルを取得しようとした場合に出るエラーです。
事前に対象のファイルを開くように指定するなど、構文を見直してみましょう。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
空のブックが生成される・残る
作業環境によっては「空のブック(Book1)」が生成されたり、残ってしまう場合があります。
このまま作業を続けると、空のブックがどんどん増えていく可能性があるため対処が必要です。
対処法としましては、何か別のエクセルを開いたままにしておきましょう。
そうすることで、空のブックは生成されません。
作業を始める前に、適当なエクセルファイルをひとつ開いておくことをおすすめします。
いつまでたっても実行されない
エラーは出ていないのに、いつまでたっても実行されない場合は、実行内容がエクセルに届いていない可能性があります。
「books.active」「sheets.active」を使用していて、エクセルファイルが最小化されていると、実行内容がエクセルに届かない場合があります。(もう1度実行すると、同じ内容が2回実行される)
エクセルは最小化せず、コードエディタとエクセルを並べて表示させた状態で実行するとうまくいきやすいです。
最後に
xlwingsでエクセルファイルに新しいシートを追加する方法を解説いたしました。
当ブログでは、xlwingsやopenpyxlなど、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!