作業報告書をエクセルで提出していますが、来年分作る必要がありめんどくさかったのでAIに頼みました。
python実行環境構築1h、プロンプト作成1.5hぐらいの作業時間でできました。
環境構築の方が難しくてプロンプト作成はトライアンドエラーで条件を追加していけば良いので簡単です。
AI使うところのtipsなども共有できればと思います。
成果物
作業報告書自体はシンプルなものです。
・21日から始まり、20日で終わる
・休日は背景ピンク
・数値の合計が必要
etcなど仕様もAIが考慮して作成してくれました。
AIに作成依頼する際のtips
・条件を追加して期待した結果が返ってこない場合、少し文言を変えて同じように再作成をしてみる。
→AIは同じ結果を返さずに違う記述で返すことがしばしばあります。
・画像を添付する
→元々フォーマットがあれば画像を添付することでAIが理解しやすくなります。これは人間でも同じですね。
pythonのスクリプト
環境情報
Python 3.13.1
Homebrew 4.4.11
make_work_reports.py
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Alignment, Border, Side, Font
from datetime import datetime, timedelta
def create_work_report():
wb = Workbook()
# 祝日データの作成
holiday_data = {
'日付': ['2025/1/1', '2025/1/13', '2025/2/11', '2025/2/23', '2025/2/24',
'2025/3/20', '2025/4/29', '2025/5/3', '2025/5/4', '2025/5/5',
'2025/5/6', '2025/7/21', '2025/8/11', '2025/9/15', '2025/9/23',
'2025/10/13', '2025/11/3', '2025/11/23', '2025/11/24'],
'休日名': ['元日', '成人の日', '建国記念の日', '天皇誕生日', '天皇誕生日振替休日',
'春分の日', '昭和の日', '憲法記念日', 'みどりの日', 'こどもの日',
'こどもの日振替休日', '海の日', '山の日', '敬老の日', '秋分の日',
'スポーツの日', '文化の日', '勤労感謝の日', '勤労感謝の日振替休日']
}
# 祝日の日付をセットとして保持
holiday_dates = set()
holiday_names = {}
for date_str, name in zip(holiday_data['日付'], holiday_data['休日名']):
date = datetime.strptime(date_str, '%Y/%m/%d')
holiday_dates.add(date.strftime('%Y-%m-%d'))
holiday_names[date.strftime('%Y-%m-%d')] = name
# 2025年の休日シートを作成
holiday_sheet = wb.create_sheet(title='2025年の休日')
for i, (date_str, name) in enumerate(zip(holiday_data['日付'], holiday_data['休日名']), 1):
holiday_sheet.cell(row=i, column=1, value=date_str)
holiday_sheet.cell(row=i, column=2, value=name)
# スタイルの定義
pink_fill = PatternFill(start_color='FFF2DCDB', end_color='FFF2DCDB', fill_type='solid')
border = Border(left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin'))
# 各月のシートを作成
for month in range(1, 13):
sheet_name = f'25年{month}月度'
ws = wb.create_sheet(title=sheet_name)
# ヘッダー設定
ws['A1'] = f'2025年{month}月度 作業報告書'
ws['A1'].font = Font(size=14, bold=True)
ws['A2'] = '氏名:'
# 列ヘッダー
headers = ['月', '日', '曜日', '実働(h)', '作業内容']
for col, header in enumerate(headers, 1):
cell = ws.cell(row=4, column=col)
cell.value = header
cell.border = border
cell.alignment = Alignment(horizontal='center')
cell.font = Font(bold=True)
# 日付データの作成
if month == 1:
start_date = datetime(2024, 12, 21)
else:
start_date = datetime(2025, month - 1, 21)
end_date = datetime(2025, month, 20)
row = 5
current_date = start_date
while current_date <= end_date:
weekday_ja = ['月', '火', '水', '木', '金', '土', '日'][current_date.weekday()]
date_str = current_date.strftime('%Y-%m-%d')
ws.cell(row=row, column=1, value=current_date.month)
ws.cell(row=row, column=2, value=current_date.day)
ws.cell(row=row, column=3, value=weekday_ja)
# 土日または祝日の場合
is_holiday = date_str in holiday_dates
is_weekend = current_date.weekday() >= 5
if is_holiday or is_weekend:
for col in range(1, 6):
ws.cell(row=row, column=col).fill = pink_fill
if is_holiday:
ws.cell(row=row, column=5, value=holiday_names[date_str])
# 罫線の設定
for col in range(1, 6):
ws.cell(row=row, column=col).border = border
row += 1
current_date += timedelta(days=1)
# 合計行の追加
ws.cell(row=row, column=3, value='計:')
ws.cell(row=row, column=3).alignment = Alignment(horizontal='right')
ws.cell(row=row, column=4, value=f'=SUM(D5:D{row-1})')
ws.cell(row=row, column=4).alignment = Alignment(horizontal='center')
# 列幅の調整
ws.column_dimensions['A'].width = 8
ws.column_dimensions['B'].width = 8
ws.column_dimensions['C'].width = 8
ws.column_dimensions['D'].width = 12
ws.column_dimensions['E'].width = 40
# デフォルトシートの削除
wb.remove(wb['Sheet'])
# ファイルの保存
wb.save('2025年_作業報告書_名前.xlsx')
if __name__ == '__main__':
create_work_report()