PythonでExcelの罫線を引こうとする場合、セルごとに上下左右に個別の指定を行う必要があると説明したが、前回はこの機能を使って表を引く方法を取り上げた。今回は同じ機能を使ってボックス(枠線)を引く方法を説明する。

連載「PythonでExcel作業の効率化を図ろう」のこれまでの回はこちらを参照

テンプレートにボックスを引いておけない時への対処

Microsoft Excelで書類を作成する場合、特定のデータをグループ化するために全体を線で囲むことがある。例えば、請求書や領収書であれば送付元企業の社名や住所を記入しているデータを枠線で囲んでグループ化するといったような使い方だ。

Microsoft Excelの書類をプログラムから操作して自動的に生成するような処理を行う場合、Microsoft Excelのデータを一から作成するケースはあまりないだろう。テンプレートを作っておいて、そこに必要なデータをプログラムで入力するといったような操作を行うことが多いと思う。

しかしながら、場合よってはそうした操作では処理できないことがある。例えば、ボックスを引きたい部分に入力されるデータが個別に異なる複数行に渡るような内容で、テンプレートファイルにボックスを引いておけないようなケースだ。

そうしたケースでは、入力されるデータに合わせてあとからMicrosoft Excelの特定の領域にボックスを引く必要がある。今回取り上げるサンプルはそうしたケースで使うことができる内容だ。

ボックスを引くPythonスクリプト

では、早速複数のセルにボックスを引くPythonスクリプトを作成する。ここではopenpyxl_sample_box_1.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

#=========================================================================
# 罫線の定義
#=========================================================================

# 罫線 上
thin_border_top = Border(
    top=Side(style='thin'), 
    right=Side(style='none'), 
    bottom=Side(style='none'),
    left=Side(style='none')
)

# 罫線 上右
thin_border_top_right = Border(
    top=Side(style='thin'), 
    right=Side(style='thin'), 
    bottom=Side(style='none'),
    left=Side(style='none')
)

# 罫線 右
thin_border_right = Border(
    top=Side(style='none'), 
    right=Side(style='thin'), 
    bottom=Side(style='none'),
    left=Side(style='none')
)

# 罫線 下右
thin_border_bottom_right = Border(
    top=Side(style='none'), 
    right=Side(style='thin'), 
    bottom=Side(style='thin'),
    left=Side(style='none')
)

# 罫線 下
thin_border_bottom = Border(
    top=Side(style='none'), 
    right=Side(style='none'), 
    bottom=Side(style='thin'),
    left=Side(style='none')
)

# 罫線 下左
thin_border_bottom_left = Border(
    top=Side(style='none'), 
    right=Side(style='none'), 
    bottom=Side(style='thin'),
    left=Side(style='thin')
)

# 罫線 左
thin_border_left = Border(
    top=Side(style='none'), 
    right=Side(style='none'), 
    bottom=Side(style='none'),
    left=Side(style='thin')
)

# 罫線 上左
thin_border_top_left = Border(
    top=Side(style='thin'), 
    right=Side(style='none'), 
    bottom=Side(style='none'),
    left=Side(style='thin')
)

#=========================================================================
# セルのサイズを設定
#=========================================================================
# セル幅を設定
ws.column_dimensions['A'].width = 8                 # A列幅[文字数]
ws.column_dimensions['B'].width = 35                # B列幅[文字数]
ws.column_dimensions['C'].width = 35                # C列幅[文字数]
ws.column_dimensions['D'].width = 35                # D列幅[文字数]
ws.column_dimensions['E'].width = 35                # E列幅[文字数]
ws.column_dimensions['F'].width = 35                # F列幅[文字数]
ws.column_dimensions['G'].width = 35                # G列幅[文字数]
ws.column_dimensions['H'].width = 35                # H列幅[文字数]
ws.column_dimensions['I'].width = 35                # I列幅[文字数]
ws.column_dimensions['J'].width = 35                # J列幅[文字数]
ws.column_dimensions['K'].width = 35                # K列幅[文字数]

# セル高さを設定
ws.row_dimensions[1].height = 30                    # 1目行高さ[ポイント]
ws.row_dimensions[2].height = 60                    # 2目行高さ[ポイント]
ws.row_dimensions[3].height = 60                    # 3目行高さ[ポイント]
ws.row_dimensions[4].height = 60                    # 4目行高さ[ポイント]
ws.row_dimensions[5].height = 60                    # 5目行高さ[ポイント]
ws.row_dimensions[6].height = 60                    # 6目行高さ[ポイント]
ws.row_dimensions[7].height = 60                    # 7目行高さ[ポイント]
ws.row_dimensions[8].height = 60                    # 8目行高さ[ポイント]

#=========================================================================
# 罫線を設定
#=========================================================================
ws['B2'].border = thin_border_top_left              # 罫線 上左
ws['C2'].border = thin_border_top                   # 罫線 上
ws['D2'].border = thin_border_top                   # 罫線 上
ws['E2'].border = thin_border_top_right             # 罫線 上右

ws['B3'].border = thin_border_left                  # 罫線 左
ws['E3'].border = thin_border_right                 # 罫線 右

ws['B4'].border = thin_border_left                  # 罫線 左
ws['E4'].border = thin_border_right                 # 罫線 右

ws['B5'].border = thin_border_left                  # 罫線 左
ws['E5'].border = thin_border_right                 # 罫線 右

ws['B6'].border = thin_border_bottom_left           # 罫線 下左
ws['C6'].border = thin_border_bottom                # 罫線 下
ws['D6'].border = thin_border_bottom                # 罫線 下
ws['E6'].border = thin_border_bottom_right          # 罫線 下右

#=========================================================================
# 罫線の説明を入力
#=========================================================================
ws['B2'] = "罫線 上左"
ws['C2'] = "罫線 上"
ws['D2'] = "罫線 上"
ws['E2'] = "罫線 上右"

ws['B3'] = "罫線 左"
ws['E3'] = "罫線 右"

ws['B4'] = "罫線 左"
ws['E4'] = "罫線 右"

ws['B5'] = "罫線 左"
ws['E5'] = "罫線 右"

ws['B6'] = "罫線 下左"
ws['C6'] = "罫線 下"
ws['D6'] = "罫線 下"
ws['E6'] = "罫線 下右"

#=========================================================================
# セルのフォントを設定
#=========================================================================
for row in ws['B2:E6']:
    for cell in row:
        cell.font = Font(name='メイリオ', size=20)

#=========================================================================
# 生成したMicrosoft Excelデータをファイルへ保存
#=========================================================================
wb.save(output_xlsx_file_path
  • openpyxl_sample_box_1.pyファイルを編集中のようす

    openpyxl_sample_box_1.pyファイルを編集中のようす

このスクリプトを実行すると次のようなMicrosoft Excelファイルが生成される。

  • 生成されたMicrosoft Excelファイル

    生成されたMicrosoft Excelファイル

横4セル×縦5セルに対してボックスを引いた状態になっていることがわかる。ではどのようにこうしたボックスを引いたか見ていこう。