前回は、PythonからExcelのセルの前景色を赤色に変更する方法を説明した。ほとんど同じ方法で、Excelのセルにさまざまな装飾を施すことができる。そこで今回は、二重下線や太字などを行う方法を取り上げる。

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

請求データは前回と同じ

今回使う請求データは前回と同じだ。2024年1月の「マイナビシステムD」社の請求データに割引価格を追加した次のデータを使用する。

  • 利用する請求データ

    利用する請求データ

それでは、早速スクリプトを作ろう。

セルを装飾するスクリプトを作成する

まずは、今回の成果物を次に示す。前回に作成したgen_invoice_3.pyに対してさらに装飾を変更する処理を追加したものだ。

gen_invoice_4.py

import argparse
import openpyxl
import pandas

from openpyxl.styles import Font

#=========================================================================
# 初期値を設定
#=========================================================================
invoice_template_xlsx_file_path = '税の計算を含むサービス請求書.xlsx'
invoice_template_sheet_name = 'サービス請求書'
invoice_output_xlsx_file_path = 'サンプルファイル.xlsx'
billing_company_data_xlsx_file_path = '請求先データ.xlsx'
billing_data_xlsx_file_path = '請求データ.xlsx'
billing_company_name = 'マイナビシステムズD'
billing_month = '202401'
sales_tax_rate = 0.1

#=========================================================================
# コマンドライン引数を解析
#=========================================================================
parser = argparse.ArgumentParser(description='Excelデータファイルから指定された会社の指定された月の請求データを抽出します。')
parser.add_argument('-t', '--templateexcel', help='請求書テンプレートExcelファイルのパス')
parser.add_argument('-s', '--templatesheetname', help='請求書テンプレートのシート名')
parser.add_argument('-o', '--outputexcel', help='請求書出力Excelファイルのパス')
parser.add_argument('-b', '--billingexcel', help='請求データExcelファイルのパス')
parser.add_argument('-c', '--companyexcel', help='会社データExcelファイルのパス')
parser.add_argument('-n', '--name', help='検索する会社名')
parser.add_argument('-m', '--month', help='対象月')
parser.add_argument('-x', '--salestaxrate', help='消費税率')
args = parser.parse_args()

if args.templateexcel:
    invoice_template_xlsx_file_path = args.templateexcel
if args.templatesheetname:
    invoice_template_sheet_name = args.templatesheetname
if args.outputexcel:
    invoice_output_xlsx_file_path = args.outputexcel
if args.companyexcel:
    billing_company_data_xlsx_file_path = args.companyexcel
if args.billingexcel:
    billing_data_xlsx_file_path = args.billingexcel
if args.name:
    billing_company_name = args.name
if args.month:
    billing_month = args.month
if args.salestaxrate:
    sales_tax_rate = args.salestaxrate

#=========================================================================
# 指定された会社の会社データを取得
#=========================================================================
dataframe = pandas.read_excel(billing_company_data_xlsx_file_path)
company_data = dataframe[
    dataframe[dataframe.columns[0]] == billing_company_name
]

#=========================================================================
# 指定された会社の指定された月の請求データを取得
#=========================================================================
dataframe = pandas.read_excel(billing_data_xlsx_file_path, dtype={'対象月': str})
billing_data = dataframe[
    (dataframe[dataframe.columns[0]] == billing_company_name) &
    (dataframe[dataframe.columns[1]] == billing_month)
]

#=========================================================================
# 請求書テンプレートの読み込み
#=========================================================================
workbook = openpyxl.load_workbook(invoice_template_xlsx_file_path)
sheet = workbook[invoice_template_sheet_name]

#=========================================================================
# 請求データを書き込み
#=========================================================================
i = company_data.index[0]

name = company_data.at[i,'会社名']
zip = company_data.at[i,'郵便番号']
address = company_data.at[i,'住所']
tel = company_data.at[i,'電話番号']
charge = company_data.at[i,'請求先名']
email = company_data.at[i,'メールアドレス']

# 請求先企業
sheet['B7'] = charge
sheet['B8'] = name
sheet['B9'] = zip
sheet['B10'] = address
sheet['B11'] = tel

# 請求書
sheet['E4'] = '000-01-001'
sheet['E5'] = '月次請求'

# 消費税
sheet['E24'] = sales_tax_rate

# 請求内容
i = 13
for index, row in billing_data.iterrows():
    sheet.cell(row=i, column=2).value = row['項目名']
    sheet.cell(row=i, column=3).value = row['数']
    sheet.cell(row=i, column=4).value = row['単価']

    # 項目名に「割引」が含まれている場合には、二重下線を引く
    if '割引' in row['項目名']:
        sheet.cell(row=i, column=2).font = Font(underline="double")

    # 数が1よりも大きかった場合には、スタイルを太字にする
    if row['数'] > 1:
        sheet.cell(row=i, column=3).font = Font(bold=True)

    # 請求金額がマイナスだった場合には前景色を赤に、スタイルを太字にする
    if row['単価'] < 0:
        sheet.cell(row=i, column=4).font = Font(color="FF0000", bold=True)

    i = i + 1

#=========================================================================
# 請求書ファイルを作成
#=========================================================================
workbook.save(invoice_output_xlsx_file_path