0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

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

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

成果物

image.png

作業報告書自体はシンプルなものです。
・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()
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?