【Python】openpyxlを使ってExcelの書式を設定するサンプルコードを解説
この記事では、Pythonのopenpyxlライブラリを使って、Excelファイルの書式設定を自動化する方法を解説します。列幅や行高さ、フォント、背景色、罫線、数値形式といった見た目の調整を、サンプルコードを通して具体的に学び、Excel作業の効率化を実現するスキルを習得できます。
開発環境
- Python version: python 3.10.11
Pythonのopenpyxlとは
openpyxl(オープンパイエクセル)とは、Pythonというプログラミング言語を使って、Excelファイル(.xlsx形式)を操作するための「ライブラリ」です。ライブラリとは、特定の目的のために作られたプログラムの部品集のようなもので、これを利用することで、私たち開発者は一からコードを書かなくても、必要な機能を簡単に使うことができます。ここで言うExcelファイル(.xlsx形式)とは、Microsoft Excelで作成されるデータシートのことで、特に.xlsxという拡張子を持つファイルが一般的です。
openpyxlを使うと、Excelファイルに対して様々な操作を実行できます。具体的には、Excelのシートに入力されているデータ(セルの値)をPythonプログラムで読み込んだり、Pythonで処理した結果を新しいExcelファイルとして書き出したりすることが可能です。
また、openpyxlはデータの読み書きだけでなく、Excelの見た目を整える「書式設定」も細かく行えます。例えば、セルの文字の種類や大きさを変えるフォント設定、セルの色を変える背景色、表の区切りを示す枠線、さらには列の幅や行の高さといったレイアウトの調整もできます。これにより、単にデータを扱うだけでなく、読みやすく整理されたExcelファイルをプログラムで自動的に作成することが可能になります。
公式ドキュメント:https://openpyxl.readthedocs.io/
Pythonのopenpyxlの使い方
Pythonのopenpyxlの使い方を解説していきます。
openpyxlは、Pythonというプログラミング言語を使ってExcelファイルを操作するための、非常に便利なライブラリです。システムエンジニアとしてデータを扱ったり、自動化ツールを作成したりする際に、Excelファイルを読み込んだり、書き込んだりする場面は多くあります。openpyxlを使うことで、PythonのプログラムからExcelファイルを開いてデータを読み取ったり、新しいデータを書き込んだり、既存のデータを更新したりすることが可能になります。
openpyxlをインストール
Pythonでopenpyxlの機能を使用するためには、まずパソコンにopenpyxlをインストールする必要があります。これは、openpyxlがPythonの標準機能には含まれていないためです。インストールにはpipというコマンドを使用します。pipは、Pythonのさまざまなライブラリ(プログラムの部品や機能の集まり)を簡単にインストール・管理するためのツールです。
インストールは、お使いのパソコンのターミナル(macOSやLinuxの場合)やコマンドプロンプト(Windowsの場合)を開き、以下のコマンドを入力して実行します。
1pip install openpyxl
このコマンドを実行すると、pipが自動的にopenpyxlをダウンロードし、Pythonが使える状態に設定します。
これでopenpyxlを使用するための準備が完了しました。インストールが成功したことを確認するには、Pythonの対話モードでimport openpyxlと入力し、エラーが出なければ正しくインストールされています。この準備が整えば、Pythonプログラムの中でopenpyxlを使ってExcelファイルを操作できるようになります。
Pythonのopenpyxlで書式を設定する
次にPythonのopenpyxlで、Excelの表に書式を設定するサンプルコードを解説していきます。
今回使用するExcelファイル
今回は集計表.xlsxというExcelファイルを使用します。
集計表.xlsxには、1行目にヘッダー、A列に会社名、2列目以降に月ごとの売上が入った表があります。
普段は手作業で行っている背景色やフォントなどの書式の設定を、Pythonで自動化します。
書式設定のサンプルコード
下記はopenpyxlを使用して集計表.xlsxの表に列の幅・行の高さ・ヘッダーの書式・データの書式を設定し、書式設定.xlsxとして保存するサンプルコードです。
1# 必要なライブラリをインポート 2from openpyxl import load_workbook 3from openpyxl.styles import Font, Alignment, PatternFill, Border, Side 4 5# Excelファイルを読み込む 6file_path = './集計表.xlsx' 7wb = load_workbook(file_path) 8ws = wb.active 9 10# 書式を設定するセルの範囲を指定 11## ヘッダーの範囲を指定 12header_row = 1 13## ラベルの範囲を指定 14label_column = 1 15## データの範囲を指定 16date_start_row = 2 17date_end_row = ws.max_row 18## 項目の範囲を指定 19date_start_column = 1 20date_end_column = ws.max_column 21 22# セルの書式を設定 23## ベースの書式を設定 24base_font = Font(name='Meiryo', size=12) 25base_border = Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),bottom=Side(style='thin')) 26 27## ヘッダーの書式を設定 28header_fill = PatternFill(start_color='404040',end_color='404040', fill_type='solid') 29header_font = Font(color='FFFFFF', bold=True, size=12) 30 31# 書式を適用する 32## 列の幅を適用 33for col in range(date_start_column, date_end_column + 1): 34 if col == label_column: 35 ws.column_dimensions[ws.cell(row=header_row, column=col).column_letter].width = 30 36 else: 37 ws.column_dimensions[ws.cell(row=header_row, column=col).column_letter].width = 15 38 39## 行の高さを適用 40for row in range(date_start_row, date_end_row + 1): 41 ws.row_dimensions[row].height = 20 42 43## ヘッダーの書式設定を適用 44for row in range(header_row, date_start_row): 45 for col in range(date_start_column, date_end_column +1 ): 46 header_cell = ws.cell(row=row, column=col) 47 header_cell.fill = header_fill 48 header_cell.font = header_font 49 header_cell.alignment = Alignment(horizontal='center', vertical='center') 50 header_cell.border = base_border 51 52## データの書式設定を適用 53for row in range(date_start_row, date_end_row +1): 54 for col in range(date_start_column, date_end_column + 1): 55 date_cell = ws.cell(row=row, column=col) 56 date_cell.font = base_font 57 date_cell.border = base_border 58 if isinstance(date_cell.value, (int, float)): 59 date_cell.number_format = '#,##0' 60 61# ファイルを保存 62wb.save("書式設定.xlsx")
作成したファイルは、以下のコマンドで実行できます。
1python excel.py
ライブラリをインポートする
まずは必要なライブラリをインポートします。
1from openpyxl import load_workbook 2from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
load_workbookはExcelファイルを読み込むためのものです。
openpyxl.stylesからは、書式を設定するための以下のクラスをインポートしています。
Font:フォントの種類・サイズ・色・太字などを設定します。Alignment:文字の配置(中央寄せなど)を設定します。PatternFill:セルの背景色を設定します。Border:セルの枠線を設定します。Side:枠線の種類を設定します。
Excelファイルを読み込み書式を設定する範囲を指定する
次にExcelファイルを読み込み、書式を設定するセルの範囲を指定します。
1file_path = './集計表.xlsx' 2wb = load_workbook(file_path) 3ws = wb.active 4 5header_row = 1 6label_column = 1 7date_start_row = 2 8date_end_row = ws.max_row 9date_start_column = 1 10date_end_column = ws.max_column
wb.activeで、現在アクティブになっているワークシートを取得しています。
ヘッダーは1行目、ラベル(会社名)はA列、データは2行目からです。
データの最終行と最終列は、数字を直接書くと表のデータが増えたときに修正が必要になるため、ws.max_rowとws.max_columnで自動的に取得しています。
書式を定義する
次に、セルに設定する書式を定義します。
1base_font = Font(name='Meiryo', size=12) 2base_border = Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),bottom=Side(style='thin')) 3 4header_fill = PatternFill(start_color='404040',end_color='404040', fill_type='solid') 5header_font = Font(color='FFFFFF', bold=True, size=12)
base_fontではフォントをメイリオ、サイズを12に設定しています。
base_borderでは、上下左右の枠線をSide(style='thin')で細い線に設定しています。
header_fillでは、ヘッダーの背景色を灰色(404040)で塗りつぶす設定にしています。start_colorとend_colorに違う色を指定すると、グラデーションにすることもできます。
header_fontでは、背景色が灰色なので文字色を白(FFFFFF)にし、bold=Trueで太字にしています。
列の幅と行の高さを設定する
次に、列の幅と行の高さを設定します。
1for col in range(date_start_column, date_end_column + 1): 2 if col == label_column: 3 ws.column_dimensions[ws.cell(row=header_row, column=col).column_letter].width = 30 4 else: 5 ws.column_dimensions[ws.cell(row=header_row, column=col).column_letter].width = 15 6 7for row in range(date_start_row, date_end_row + 1): 8 ws.row_dimensions[row].height = 20
column_letterで「A」「B」のような列を表す文字を取得し、column_dimensionsでその列の幅を設定しています。
会社名のラベル列は幅を30、それ以外の列は幅を15にしています。
row_dimensionsでは、データの行の高さを20に設定しています。
ヘッダーの書式を適用する
次に、ヘッダーのセルに書式を適用します。
1for row in range(header_row, date_start_row): 2 for col in range(date_start_column, date_end_column +1 ): 3 header_cell = ws.cell(row=row, column=col) 4 header_cell.fill = header_fill 5 header_cell.font = header_font 6 header_cell.alignment = Alignment(horizontal='center', vertical='center') 7 header_cell.border = base_border
ws.cell(row=行, column=列)でセルを1つずつ取得し、背景色・フォント・配置・枠線を設定しています。
Alignment(horizontal='center', vertical='center')で、文字を左右中央・上下中央に配置しています。
データの書式を適用する
最後に、データのセルに書式を適用します。
1for row in range(date_start_row, date_end_row +1): 2 for col in range(date_start_column, date_end_column + 1): 3 date_cell = ws.cell(row=row, column=col) 4 date_cell.font = base_font 5 date_cell.border = base_border 6 if isinstance(date_cell.value, (int, float)): 7 date_cell.number_format = '#,##0'
データのセルには、ベースのフォントと枠線を設定しています。
さらにisinstanceでセルの値が数値(intまたはfloat)かどうかを判定し、数値の場合はnumber_format = '#,##0'で3桁区切りのカンマ表示にしています。
この書式は、Excelの「セルの書式設定」のユーザー定義で使う書式と同じものです。
ファイルを保存する
最後にファイルを保存します。
1wb.save("書式設定.xlsx")
ファイルの保存はワークシート(ws)ではなく、ワークブック(wb)のsaveメソッドで行うので注意してください。
実行すると書式設定.xlsxが作成され、表に書式が設定されていることが確認できます。
おわりに
この記事では、Pythonのopenpyxlライブラリを活用してExcelファイルの書式設定を自動化する方法を習得しました。FontやPatternFillといったスタイル設定の基本を学び、セルの列幅、行の高さ、背景色、フォント、罫線などをプログラムで調整できることを確認しました。また、ws.max_rowやws.max_columnを使うことで、データ量が変わっても対応できる柔軟なコードを作成できることを理解しました。これらのスキルは、日々のExcel作業を効率化し、システムエンジニアとしての自動化能力を高めることに役立ちます。今後もPythonで様々な作業を自動化し、より効率的な開発を目指していきましょう。