【openpyxlでの書式取得方法まとめ】罫線・フォント・背景など

スポンサードリンク
Python

この記事は、下記のような方におすすめです

  • openpyxlで書式を取得する方法が知りたい
  • openpyxlで取得した書式を別のシートや別のブックにコピーしたい
  • openpyxlで書式を一括コピーしたい

この記事を読んでわかること

  • openpyxlで書式を取得・コピーする方法がわかる
  • openpyxlで書式を一括コピーする方法がわかる
  • エラーが出た時の対処法がわかる
スポンサードリンク

openpyxlで書式を取得・コピーする方法

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

取得・コピーする書式によって、インポートする内容が異なります。
下記の3種類に分けて解説いたします。

  • フォント(サイズ・太字・斜体など)
  • 背景(色・タイプ)
  • 罫線(線種・太さ)

事前準備

  • openpyxlのインストール

既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。

openpyxlのインストール方法

openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。

pip install openpyxl

※openpyxlを使用したことがある場合は、このインストール作業は不要です。

インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。

フォント(サイズ・太字・斜体など)を取得・コピー

まずはフォントを取得・コピーしてみましょう。

下記コードを記述することで、「Sheet1のA1セル」のフォントを取得して、「Sheet2のA1セル」にコピーすることができます。

import openpyxl
from openpyxl.styles import Font

wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']

cell1 = ws1['A1']
cell2 = ws2['A1']

cell2.font = Font(name=cell1.font.name)

wb.save('output.xlsx')

コードの8・9行目で「コピー元のセル」と「コピー先のセル」を変数に代入します。
11行目で、コピー元のセルからフォントを取得し、コピー先のセルにフォントをコピーしています。

フォントの取得・コピー

太字を取得したい場合は、コードの「name」のところを「bold」に変えてください。

  • フォント名:name
  • フォントサイズ:size
  • 太字:bold
  • 斜体:italic
  • 上付き文字・下付き文字:vertAlign
  • 下線:underline
  • 取り消し線:strike
  • フォントカラー:color
cell2.font = Font(name=cell1.font.name)
cell2.font = Font(size=cell1.font.size)
cell2.font = Font(bold=cell1.font.bold)
cell2.font = Font(italic=cell1.font.italic)
cell2.font = Font(vertAlign=cell1.font.vertAlign)
cell2.font = Font(underline=cell1.font.underline)
cell2.font = Font(strike=cell1.font.strike)
cell2.font = Font(color=cell1.font.color)

詳細な解説は下記記事で行っておりますので、ご参考ください。

背景(色・タイプ)を取得・コピー

次に、セルの背景を取得・コピーする方法です。

下記コードを記述することで、「Sheet1のA1セル」の背景を取得して、「Sheet2のA1セル」にコピーすることができます。

import openpyxl
from openpyxl.styles import PatternFill

wb = openpyxl.load_workbook('input.xlsx')
ws1 = wb['Sheet1']
ws2 = wb['Sheet2']

cell1 = ws1['A1']
cell2 = ws2['A1']

cell2.fill = PatternFill(patternType=cell1.fill.patternType, fgColor=cell1.fill.fgColor)

wb.save('output.xlsx')

前項のフォントを取得する場合と似ています(インポートと11行目以外は全く同じ)
コードの8・9行目で「コピー元のセル」と「コピー先のセル」を変数に代入します。
11行目で、コピー元のセルから背景(タイプと色)を取得し、コピー先のセルに背景をコピーしています。

背景の取得・コピー

詳細な解説は下記記事で行っておりますので、ご参考ください。

罫線(線種・太さ)を取得・コピー

3つ目は、罫線を取得・コピーする方法です。

下記コードを記述することで、「Sheet1のB2セル」の罫線を取得して、「別のブックのB2セル」にコピーすることができます。

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')

前項までの「フォント」や「背景」とは違い、「別のブック」にコピーしているためコードが違います。
また、セルの指定方法も違うため難しく見えるかもしれませんが、簡単です。

コードの10~13行目でB2セルの罫線を取得します。
取得した罫線を、14行目で別ブックのB2セルにコピーしています。

罫線の取得・コピー

詳細な解説は下記記事で行っておりますので、ご参考ください。

スポンサードリンク

書式を一括でコピーする方法

では、これまで解説した書式を一括でコピーしてみましょう。

import openpyxl
from openpyxl.styles import PatternFill, Border, Side, Font

wb = openpyxl.load_workbook('input.xlsx')

ws1 = wb['Sheet1']
ws2 = wb['Sheet2']

r = 0
c = 0

for row1 in ws1 :
    c = 1
    r = r + 1
    for cell1 in row1 :
        ws2.cell(row=r, column=c).font = Font(
            name=cell1.font.name,
            size=cell1.font.size,
            bold=cell1.font.bold,
            italic=cell1.font.italic,
            vertAlign=cell1.font.vertAlign,
            underline=cell1.font.underline,
            strike=cell1.font.strike,
            color=cell1.font.color
        )
        
        ws2.cell(row=r, column=c).fill = PatternFill(
            patternType=cell1.fill.patternType, 
            fgColor=cell1.fill.fgColor
        )
        
        left_border = ws1.cell(row=r, column=c).border.left.border_style
        right_border = ws1.cell(row=r, column=c).border.right.border_style
        top_border = ws1.cell(row=r, column=c).border.top.border_style
        bottom_border = ws1.cell(row=r, column=c).border.bottom.border_style
        ws2.cell(row=r, column=c).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.save('output.xlsx')

これで、Sheet1の全セルの書式を、Sheet2に丸々コピーすることができます。
これまで紹介した3種類の書式を取得してコピーする方法を、for文で繰り返しています。

もう少し簡略化できるのですが、こちらの方がわかりやすいかと思います。

for文については別の記事で詳しく解説しておりますので、そちらをご参考ください。

スポンサードリンク

うまく動作しない場合の対処法

エラーが出る

No such file or directory: ○○

これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。

詳しい解説は、下記記事をご参考ください。

Permission denied: ○○

操作しようとしているファイルにアクセスできないというエラーです。
ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。

詳しい解説は、下記記事をご参考ください。

Worksheet ○○ does not exist

「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。

詳しい解説は、下記記事をご参考ください。

○○ is not defined

今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。

詳しい解説は、下記記事をご参考ください。

その他のエラー

その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。

スポンサードリンク

最後に

openpyxlで書式を取得・コピーする方法を解説いたしました。

当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

挫折せずにPythonを独学で学習する方法は特におすすめです。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました