Microsoft Excelのようなスプレッドシートアプリケーションで重要になってくるのが罫線だ。今回はPythonからMicrosoft Excelの罫線を引く方法を取り上げる。ちょっとコードは長くなるが知っておくに越したことはないので、すべての罫線の基本的な引き方をまとめる。
連載「PythonでExcel作業の効率化を図ろう」のこれまでの回はこちらを参照。
空のMicrosoft Excelファイルを作る
今回もまず最初にPythonのOpenPyXLライブラリを使って空のMicrosoft Excelファイルを生成するスクリプトを確認する。
openpyxl_sample_cell_1.py
import openpyxl
#=========================================================================
# 保存するファイルのパス
#=========================================================================
output_xlsx_file_path = 'サンプルファイル.xlsx'
#=========================================================================
# Microsoft Exce データの生成とワークシートの取得
#=========================================================================
# 新規ワークブックの作成
wb = openpyxl.Workbook()
# アクティブワークシートの取得
ws = wb.active
#=========================================================================
# Microsoft Exce データの生成とワークシートの取得
#=========================================================================
# 何も編集せず
#=========================================================================
# 生成したMicrosoft Excelデータをファイルへ保存
#=========================================================================
wb.save(output_xlsx_file_path
このスクリプトを実行すると次のような空のMicrosoft Excelファイルが生成される。
このスクリプトに罫線を引くスクリプトを追加していく。
Border()とSide()で罫線を引く
PythonのOpenPyXLライブラリを使って罫線を引く場合、セルの.borderにBorderオブジェクトを代入する形で指定を行うことになる。Borderオブジェクトは上下左右の罫線指定を行って生成されるブジェクトで、罫線の指定にはSideオブジェクトを使う。生成する罫線の種類(細線、太線、二重線など)の指定はSide()にstyle='スタイル'の形で指定する。
先に今回の成果物を次に示す。ちょっと長いが、すべての種類のスタイルを使っておきたいのでこの長さになっている。
openpyxl_sample_cell_3.py
import openpyxl
from openpyxl.styles import Font
from openpyxl.styles import Border, Side
#=========================================================================
# 保存するファイルのパス
#=========================================================================
output_xlsx_file_path = 'サンプルファイル.xlsx'
#=========================================================================
# Microsoft Exce データの生成とワークシートの取得
#=========================================================================
# 新規ワークブックの作成
wb = openpyxl.Workbook()
# アクティブワークシートの取得
ws = wb.active
#=========================================================================
# 罫線の定義
#=========================================================================
# 極細罫線
hair_border = Border(
left=Side(style='hair'),
right=Side(style='hair'),
top=Side(style='hair'),
bottom=Side(style='hair')
)
# 細罫線
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# 中太罫線
medium_border = Border(
left=Side(style='medium'),
right=Side(style='medium'),
top=Side(style='medium'),
bottom=Side(style='medium')
)
# 太罫線
thick_border = Border(
left=Side(style='thick'),
right=Side(style='thick'),
top=Side(style='thick'),
bottom=Side(style='thick')
)
# 二重罫線
double_border = Border(
left=Side(style='double'),
right=Side(style='double'),
top=Side(style='double'),
bottom=Side(style='double')
)
# 点罫線
dotted_border = Border(
left=Side(style='dotted'),
right=Side(style='dotted'),
top=Side(style='dotted'),
bottom=Side(style='dotted')
)
# 破罫線
dashed_border = Border(
left=Side(style='dashed'),
right=Side(style='dashed'),
top=Side(style='dashed'),
bottom=Side(style='dashed')
)
# 破点罫線
dashDot_border = Border(
left=Side(style='dashDot'),
right=Side(style='dashDot'),
top=Side(style='dashDot'),
bottom=Side(style='dashDot')
)
# 破点点罫線
dashDotDot_border = Border(
left=Side(style='dashDotDot'),
right=Side(style='dashDotDot'),
top=Side(style='dashDotDot'),
bottom=Side(style='dashDotDot')
)
# 斜め破点罫線
slantDashDot_border = Border(
left=Side(style='slantDashDot'),
right=Side(style='slantDashDot'),
top=Side(style='slantDashDot'),
bottom=Side(style='slantDashDot')
)
# 中太点罫線
mediumDot_border = Border(
left=Side(style='mediumDashed'),
right=Side(style='mediumDashed'),
top=Side(style='mediumDashed'),
bottom=Side(style='mediumDashed')
)
# 中太破点罫線
mediumDashDot_border = Border(
left=Side(style='mediumDashDot'),
right=Side(style='mediumDashDot'),
top=Side(style='mediumDashDot'),
bottom=Side(style='mediumDashDot')
)
# 中太破点点罫線
mediumDashDotDot_border = Border(
left=Side(style='mediumDashDotDot'),
right=Side(style='mediumDashDotDot'),
top=Side(style='mediumDashDotDot'),
bottom=Side(style='mediumDashDotDot')
)
#=========================================================================
# セルのサイズを設定
#=========================================================================
# セル幅を設定
ws.column_dimensions['A'].width = 5 # A列幅[文字数]
ws.column_dimensions['B'].width = 30 # B列幅[文字数]
ws.column_dimensions['C'].width = 5 # C列幅[文字数]
ws.column_dimensions['D'].width = 30 # D列幅[文字数]
ws.column_dimensions['E'].width = 5 # E列幅[文字数]
ws.column_dimensions['F'].width = 30 # F列幅[文字数]
ws.column_dimensions['G'].width = 5 # G列幅[文字数]
ws.column_dimensions['H'].width = 30 # H列幅[文字数]
ws.column_dimensions['I'].width = 5 # I列幅[文字数]
ws.column_dimensions['J'].width = 30 # J列幅[文字数]
ws.column_dimensions['K'].width = 5 # K列幅[文字数]
# セル高さを設定
ws.row_dimensions[1].height = 30 # 1目行高さ[ポイント]
ws.row_dimensions[2].height = 60 # 2目行高さ[ポイント]
ws.row_dimensions[3].height = 30 # 3目行高さ[ポイント]
ws.row_dimensions[4].height = 60 # 4目行高さ[ポイント]
ws.row_dimensions[5].height = 30 # 5目行高さ[ポイント]
ws.row_dimensions[6].height = 60 # 6目行高さ[ポイント]
ws.row_dimensions[7].height = 30 # 7目行高さ[ポイント]
ws.row_dimensions[8].height = 60 # 8目行高さ[ポイント]
#=========================================================================
# 罫線を設定
#=========================================================================
ws['B2'].border = hair_border # 極細罫線
ws['D2'].border = thin_border # 細罫線
ws['F2'].border = medium_border # 中太罫線
ws['H2'].border = thick_border # 太罫線
ws['B4'].border = double_border # 二重罫線
ws['B6'].border = dotted_border # 点罫線
ws['D6'].border = dashed_border # 破罫線
ws['F6'].border = dashDot_border # 破点罫線
ws['H6'].border = dashDotDot_border # 破点点罫線
ws['B8'].border = slantDashDot_border # 斜め破点罫線
ws['D8'].border = mediumDot_border # 中太点罫線
ws['F8'].border = mediumDashDot_border # 中太破点罫線
ws['H8'].border = mediumDashDotDot_border # 中太破点点罫線
#=========================================================================
# 罫線の説明を入力
#=========================================================================
ws['B2'] = '極細罫線'
ws['B2'].font = Font(name='メイリオ', size=20)
ws['D2'] = '細罫線'
ws['D2'].font = Font(name='メイリオ', size=20)
ws['F2'] = '中太罫線'
ws['F2'].font = Font(name='メイリオ', size=20)
ws['H2'] = '太罫線'
ws['H2'].font = Font(name='メイリオ', size=20)
ws['B4'] = '二重罫線'
ws['B4'].font = Font(name='メイリオ', size=20)
ws['B6'] = '点罫線'
ws['B6'].font = Font(name='メイリオ', size=20)
ws['D6'] = '破罫線'
ws['D6'].font = Font(name='メイリオ', size=20)
ws['F6'] = '破点罫線'
ws['F6'].font = Font(name='メイリオ', size=20)
ws['H6'] = '破点点罫線'
ws['H6'].font = Font(name='メイリオ', size=20)
ws['B8'] = '斜め破点罫線'
ws['B8'].font = Font(name='メイリオ', size=20)
ws['D8'] = '中太点罫線'
ws['D8'].font = Font(name='メイリオ', size=20)
ws['F8'] = '中太破点罫線'
ws['F8'].font = Font(name='メイリオ', size=20)
ws['H8'] = '中太破点点罫線'
ws['H8'].font = Font(name='メイリオ', size=20)
#=========================================================================
# 生成したMicrosoft Excelデータをファイルへ保存
#=========================================================================
wb.save(output_xlsx_file_path)
このスクリプトを実行すると次のようなMicrosoft Excelfileが生成される。
上記スクリーンショットがOpenPyXLから指定できる罫線の種類を網羅している。基本的にはすべての罫線を指定できるようになっていることがわかると思う。