元データと同じ表を作るため、罫線を新しく作ったブックにコピーしたい。
なるほど…。
では今回は、
「openpyxlで罫線をコピーする方法」
をできるだけわかりやすく解説いたします。
また、「表全体の罫線をコピーする方法」も紹介いたします。
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
openpyxlで罫線をコピーするには
「border_style」で取得した罫線を「Border()」で貼り付けします。
まずは実行見本をどうぞ。
実行見本
全コード
ひとまず全コードを網羅します。
少し長いですが、後ほど1つ1つ解説いたします。
import openpyxl
from openpyxl.styles.borders import Border, Side
wb_in = openpyxl.load_workbook('input.xlsx')
ws_in = wb_in['Sheet1']
wb_out = openpyxl.Workbook()
ws_out = wb_out.active
left_border = ws_in.cell(column=2, row=2).border.left.border_style
right_border = ws_in.cell(column=2, row=2).border.right.border_style
top_border = ws_in.cell(column=2, row=2).border.top.border_style
bottom_border = ws_in.cell(column=2, row=2).border.bottom.border_style
ws_out.cell(column=2, row=2).border = Border(left=Side(style=left_border), right=Side(style=right_border), top=Side(style=top_border), bottom=Side(style=bottom_border))
wb_out.save('output.xlsx')
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
罫線をコピーする手順は以下のとおりです。
- 新しいブックを作る
- 元データ(input.xlsx)の罫線を取得する
- 新しいブック(output.xlsx)に罫線を貼り付ける
1つ1つ解説いたします。
新しいブックを作る
wb_out = openpyxl.Workbook()
ws_out = wb_out.active
7行目で新しいブックを作成し、
8行目でアクティブシートを取得しています。
詳細は下記記事をご参考ください。
新しいブックではなく既存のブックや、同一ブックの別シートにも応用できます。
元データ(input.xlsx)の罫線を取得する
left_border = ws_in.cell(column=2, row=2).border.left.border_style
right_border = ws_in.cell(column=2, row=2).border.right.border_style
top_border = ws_in.cell(column=2, row=2).border.top.border_style
bottom_border = ws_in.cell(column=2, row=2).border.bottom.border_style
上記10行目~13行目で、元データの罫線を取得しています。
(左側・右側・上側・下側の4種類を取得)
詳細は下記記事をご参考ください。
新しいブック(output.xlsx)に罫線を貼り付ける
ws_out.cell(column=2, row=2).border = Border(left=Side(style=left_border), right=Side(style=right_border), top=Side(style=top_border), bottom=Side(style=bottom_border))
前項で取得した罫線を新しいブックに貼り付けしています。
インポート含め、罫線設定の詳細は下記記事をご覧ください。
表全体の罫線をコピーする
前項ではセル1つの罫線をコピーしましたが、
下図のような表全体の罫線をコピーすることもできます。
import openpyxl
from openpyxl.styles.borders import Border, Side
wb_in = openpyxl.load_workbook('input.xlsx')
ws_in = wb_in['Sheet1']
wb_out = openpyxl.Workbook()
ws_out = wb_out.active
r = 0
for row in ws_in :
r = r + 1
c = 1
for cell in row :
left_border = ws_in.cell(column=c, row=r).border.left.border_style
right_border = ws_in.cell(column=c, row=r).border.right.border_style
top_border = ws_in.cell(column=c, row=r).border.top.border_style
bottom_border = ws_in.cell(column=c, row=r).border.bottom.border_style
ws_out.cell(column=c, row=r).border = Border(left=Side(style=left_border), right=Side(style=right_border), top=Side(style=top_border), bottom=Side(style=bottom_border))
c = c + 1
wb_out.save('output.xlsx')
▼実行結果
基本的には前項で解説したものをfor文でループさせています。
<ざっくり解説>
セル指定は変数を利用しています。
変数「c」と「r」を作り、列は変数「c」、行は変数「r」を指定します。
for文が進むにつれて「c」と「r」を1ずつ増やすことで最後まで罫線を取得・コピーすることができます。
※最初はA1(column=1, row=1)、次はB1(column=2, row=1)という具合です。
for文については下記記事をご参考ください。
値を取得できる「iter_rows()」と併せて使うことで、罫線と値をコピーすることができます。
うまく動作しない時
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで罫線をコピーする方法を解説いたしました。
当ブログでは、openpyxlやpandasなど、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!