作業報告書フォーマット(Excel)を全てAI任せで作成(python)

作業報告書をエクセルで提出していますが、来年分作る必要がありめんどくさかったのでAIに頼みました。

python実行環境構築1h、プロンプト作成1.5hぐらいの作業時間でできました。
環境構築の方が難しくてプロンプト作成はトライアンドエラーで条件を追加していけば良いので簡単です。

AI使うところのtipsなども共有できればと思います。

# 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821335/c54eee76-0a86-6734-6ecc-76bd996eb857.png)

作業報告書自体はシンプルなものです。
・21日から始まり、20日で終わる
・休日は背景ピンク
・数値の合計が必要
etcなど仕様もAIが考慮して作成してくれました。

## AIに作成依頼する際のtips
・条件を追加して期待した結果が返ってこない場合、少し文言を変えて同じように再作成をしてみる。
→AIは同じ結果を返さずに違う記述で返すことがしばしばあります。

・画像を添付する
→元々フォーマットがあれば画像を添付することでAIが理解しやすくなります。これは人間でも同じですね。

# pythonのスクリプト
## 環境情報
Python 3.13.1
Homebrew 4.4.11
```python: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()
```