xlwingsでエクセルを編集しているんだけど、
今あるシートをコピーして、今月のデータのテンプレートにしたい…。
なるほど…。では今回は、
「xlwingsでシートをコピーする方法」をできるだけわかりやすく解説いたします。
また、「シートをコピーする際の注意点」も紹介いたします。
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
xlwingsでシート名を変更するには
「copy」を使います。まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。解説は後ほど行います。
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
copy_sheet = worksheet.copy(name='Sheet1のコピー')
copy_sheet = worksheet.copy(name='Sheet1のコピー')
xlwingsの処理は、予想以上に時間がかかることがあります。
プログラムの最後に「print(‘実行完了’)」などを追記し、完了したのを確認してから結果を見ましょう。
事前準備
- xlwingsのインストール
エクセルファイルを実際に操作するには、「xlwings」のインストールが必要になります。
xlwingsのインストール方法
xlwingsを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install xlwings
※xlwingsを使用したことがある場合は、このインストール作業は不要です。
インストール方法詳細やインストールができない場合の対処法、
基本的な使い方などは下記記事をご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~シートの取得
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
上記コードにて、「xlwingsのインポート」「アクティブブック・アクティブシートの取得」をしています。
詳細は「アクティブシートの取得」の記事をご覧ください。
シート名の変更
copy_sheet = worksheet.copy(name='Sheet1のコピー')
上記一文にて、取得したシートのコピーを作成することができます。
(罫線や塗りつぶしなどの書式もコピーされます)
右辺には、「取得したシート(コピー元のシート)が入った変数」に続けて「.copy()」を記述します。
()内には「name=」を記述し、「コピーしたシートにつける名前(シート名)」を記述してください。
左辺には「コピーしたシート」を入れる変数を新たに記述しましょう。
今回はわかりやすく「copy_sheet」にしていますが、何でも構いません。
一部使えない文字があります。下記記事をご参考ください。
<テンプレ>
【 変数 = コピー元のシートが入った変数.copy(name=’コピーしたシートのシート名‘) 】
シートをコピーする際の注意点
コピーしたシートに名前をつける際、「*」や「?」など実際にシート名に使うことができない文字を指定することはできません。
エラーが出るわけではありませんが、動作せずにフリーズする場合がありますので、ご注意ください。
記号は使わず、漢字・英字・数字の中からシート名を決めるのが無難です。
また、指定した名前のシートが既に存在する場合、エラーが発生して異常終了となります。
シート名は重複しないようにしましょう。
別のブックにシートをコピーする方法
ここからは、別のブックにシートをコピーする方法を紹介いたします。
Cドライブの「utatane」というフォルダに「output.xlsx」というエクセルファイルを用意しました。
今開いているブックのアクティブシートを、この「output.xlsx」にコピーしてみましょう。
▼今開いているシート
▼output.xlsx
▼全コード
import xlwings
workbook = xlwings.books.active
worksheet = workbook.sheets.active
other_book = xlwings.Book('C://utatane/output.xlsx')
worksheet.copy(before=other_book.sheets[0])
4行目までは、同一ブック内にコピーする場合と同じです。
6行目・7行目に注目してください。
6行目で別のブックである「output.xlsx」を取得しています。
7行目で、今開いているシートを、別のブックにコピーして完了です。
今回の例では、「output.xlsx」の一番前(s0の前)にシートがコピーされます。
2番目(s0の後ろ)にシートをコピーしたい場合は、下記のように記述してください。
worksheet.copy(after=other_book.sheets[0])
()内の「before」が「after」に変わっただけです。
- before:~の前
- after:~の後ろ
#シート番号[0]の前(一番前)にシートがコピーされる
worksheet.copy(before=other_book.sheets[0])
#シート番号[0]の後ろ(2番目)にシートがコピーされる
worksheet.copy(after=other_book.sheets[0])
#シート番号[-1]の後ろ(一番最後)にシートがコピーされる
worksheet.copy(after=other_book.sheets[-1])
別のブックにコピーした場合は、シート名を指定できません。
コピーした後、必要に応じてシート名を変更してください。
コピー先である別のブックに、同じ名前のシートが存在する場合は、コピー前にシート名を変更しておきましょう。
うまく動作しない時
エラーが出る
No such file: ○○
これは、読み込むファイルが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
Sheet named xxx already present in workbook
「ValueError: Sheet named xxx already present in workbook」は、「シート【xxx】は既に存在しています」というエラーです。
コピーしたシートにつけた名前が、既に存在しているシート名と同じだからダメですよと言ってきています。
つける名前を変えましょう。
‘NoneType’ object has no attribute ‘books’
エクセルブックやエクセルファイルを開いていないのに、ブックやファイルを取得しようとした場合に出るエラーです。
事前に対象のファイルを開くように指定するなど、構文を見直してみましょう。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
空のブックが生成される・残る
作業環境によっては「空のブック(Book1)」が生成されたり、残ってしまう場合があります。
このまま作業を続けると、空のブックがどんどん増えていく可能性があるため対処が必要です。
対処法としましては、何か別のエクセルを開いたままにしておきましょう。
そうすることで、空のブックは生成されません。
作業を始める前に、適当なエクセルファイルをひとつ開いておくことをおすすめします。
いつまでたっても実行されない
エラーは出ていないのに、いつまでたっても実行されない場合は、実行内容がエクセルに届いていない可能性があります。
「books.active」「sheets.active」を使用していて、エクセルファイルが最小化されていると、実行内容がエクセルに届かない場合があります。(もう1度実行すると、同じ内容が2回実行される)
エクセルは最小化せず、コードエディタとエクセルを並べて表示させた状態で実行するとうまくいきやすいです。
フリーズする
「*」や「?」など、シート名に使うことができない文字を指定していませんか?
シート名は、漢字・英字・数字の中から選ぶのが無難です。
最後に
xlwingsでエクセルファイルのシートをコピーする方法を解説いたしました。
当ブログでは、xlwingsやopenpyxlなど、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!