Sahara3のAI副業

AI副業でどこまでいけるのか?

AI副業:エクセル報告書を簡単に出したい。

「さはら3」です。

AI副業でどこまでいけるのか?をテーマに頑張っていきたいと思います。



頭の体操

  • 1か所だけ異なる漢字が入っています。(解答は一番最後に掲載)

問題


本編

今回のスクリプトは、PDFの報告書を作成するのに、Pythonで作成したい。

というスクリプトになります。

*要エクセル環境

やった事

  • Fletパッケージを利用し、PDFで報告書を作成

    • 実装失敗↓

      • 理由:PDFのレイアウト(各項目の配置)を考えるのが、大変だった。
  • 今あるエクセルを読み込んで、各セルに配置する

    • 成功

      • 出来上がったエクセルを開き、PDFにエクスポートする。

スクリプト

import flet as ft
import datetime
import openpyxl
import os
import win32com.client as win32

# 今日の日付を取得
today_date = datetime.date.today()

# 日付を文字列に変換
date_str = today_date.strftime("%Y/%m/%d")

# ヘッダーの指定
headertitle = '報告書'

def get_members_from_excel():
    # Excelファイルを読み取る
    file_path = r"C:\temp\サンプル_2023.xlsx"
    workbook = openpyxl.load_workbook(file_path)
    sheet = workbook.active

    # C列からメンバー名を読み取る
    members = []
    for row in range(1, sheet.max_row + 1):
        cell_value = sheet.cell(row=row, column=3).value
        if cell_value and cell_value != "氏名":  # セルに値があり、かつ「氏名」でない場合のみリストに追加
            members.append(cell_value)

    return members

# メンバー一覧を取得
members = get_members_from_excel()


def main(page: ft.Page):
    # テキストを表示
    page.add(ft.Text(headertitle))
    
    # 日付を入力するためのテキストフィールドを追加
    
    # date_inputの初期値として設定
    date_input = ft.TextField(label="日付 (YYYY/MM/DD)", value=date_str)
    page.add(date_input)
    
    detail_input = ft.TextField(label="活動内容", value="日報")
    page.add(detail_input)

    # メンバーを選択するためのチェックボックスを追加
    checkboxes = []
    members = get_members_from_excel()
    for member in members:
        checkbox = ft.Checkbox(label=member)
        checkboxes.append(checkbox)
        page.add(checkbox)

    # 送信ボタンとそのクリックイベントを追加
    def on_submit(event):
        # チェックボックスがオンのメンバーを取得
        selected_members = [checkbox.label for checkbox in checkboxes if checkbox.value]
 
        # Excelファイルを読み取る
        file_path = r"C:\temp\サンプル_2023.xlsx"
        workbook = openpyxl.load_workbook(file_path)
        sheet = workbook.active

        # D4セルにdate_inputの値を挿入
        sheet['D4'] = date_input.value

        # C列からメンバー名を検索
        for row in range(1, sheet.max_row + 1):
            cell_value = sheet.cell(row=row, column=3).value
            if cell_value in members:
                if cell_value in selected_members:
                    sheet.cell(row=row, column=4).value = "○"
                else:
                    sheet.cell(row=row, column=4).value = ""
        # D35セルにdate_inputの値を挿入
        sheet['D35'] = detail_input.value

        # D36セルにチェックボックスがオンの数を挿入
        sheet['D36'] = len(selected_members)

        # date_input.valueを日付オブジェクトに変換
        input_date = datetime.datetime.strptime(date_input.value, "%Y/%m/%d").date()
        
        # 日付を「2023-10-09」の形式の文字列に変換
        formatted_date = input_date.strftime("%Y-%m-%d")

        # 新しいファイル名を作成
        base_dir = os.path.dirname(file_path)
        # 保存するファイル名を生成
        new_file_name = f"{formatted_date}_{detail_input.value}_報告書_2023.xlsx"
        new_file_path = "C:\\temp\\" + new_file_name
        
        # 変更を新しいファイル名で保存
        workbook.save(new_file_path)
        
        # 結果を表示
        page.add(ft.Text(new_file_path))
        
    submit_button = ft.ElevatedButton(text="送信", on_click=on_submit)
    page.add(submit_button)

ft.app(target=main)


Amazon アフィリエイト


解説

  • まず、サンプルのエクセルファイルを用意します。

サンプル報告書


  • パッケージ等のインストール・環境設定
import flet as ft
import datetime
import openpyxl
import os
import win32com.client as win32

# 今日の日付を取得
today_date = datetime.date.today()

# 日付を文字列に変換
date_str = today_date.strftime("%Y/%m/%d")

# ヘッダーの指定
headertitle = '報告書'

  • 用意したサンプルエクセルファイルから、メンバー一覧を取得する
def get_members_from_excel():
    # Excelファイルを読み取る
    file_path = r"C:\temp\サンプル_2023.xlsx"
    workbook = openpyxl.load_workbook(file_path)
    sheet = workbook.active

    # C列からメンバー名を読み取る
    members = []
    for row in range(1, sheet.max_row + 1):
        cell_value = sheet.cell(row=row, column=3).value
        if cell_value and cell_value != "氏名":  # セルに値があり、かつ「氏名」でない場合のみリストに追加
            members.append(cell_value)

    return members

# メンバー一覧を取得
members = get_members_from_excel()

  • Fletを使用し、アプリ画面を表示し、「日付」「内容」「メンバー」を表示する。
def main(page: ft.Page):
    # テキストを表示
    page.add(ft.Text(headertitle))
    
    # 日付を入力するためのテキストフィールドを追加
    
    # date_inputの初期値として設定
    date_input = ft.TextField(label="日付 (YYYY/MM/DD)", value=date_str)
    page.add(date_input)
    
    detail_input = ft.TextField(label="活動内容", value="日報")
    page.add(detail_input)

    # メンバーを選択するためのチェックボックスを追加
    checkboxes = []
    members = get_members_from_excel()
    for member in members:
        checkbox = ft.Checkbox(label=member)
        checkboxes.append(checkbox)
        page.add(checkbox)

    # 送信ボタンとそのクリックイベントを追加
    def on_submit(event):
        # チェックボックスがオンのメンバーを取得
        selected_members = [checkbox.label for checkbox in checkboxes if checkbox.value]
 
        # Excelファイルを読み取る
        file_path = r"C:\temp\サンプル_2023.xlsx"
        workbook = openpyxl.load_workbook(file_path)
        sheet = workbook.active

        # D4セルにdate_inputの値を挿入
        sheet['D4'] = date_input.value

        # C列からメンバー名を検索
        for row in range(1, sheet.max_row + 1):
            cell_value = sheet.cell(row=row, column=3).value
            if cell_value in members:
                if cell_value in selected_members:
                    sheet.cell(row=row, column=4).value = "○"
                else:
                    sheet.cell(row=row, column=4).value = ""
        # D35セルにdate_inputの値を挿入
        sheet['D35'] = detail_input.value

        # D36セルにチェックボックスがオンの数を挿入
        sheet['D36'] = len(selected_members)

        # date_input.valueを日付オブジェクトに変換
        input_date = datetime.datetime.strptime(date_input.value, "%Y/%m/%d").date()
        
        # 日付を「2023-10-09」の形式の文字列に変換
        formatted_date = input_date.strftime("%Y-%m-%d")

        # 新しいファイル名を作成
        base_dir = os.path.dirname(file_path)
        # 保存するファイル名を生成
        new_file_name = f"{formatted_date}_{detail_input.value}_報告書_2023.xlsx"
        new_file_path = "C:\\temp\\" + new_file_name
        
        # 変更を新しいファイル名で保存
        workbook.save(new_file_path)
        
        # 結果を表示
        page.add(ft.Text(new_file_path))
        
    submit_button = ft.ElevatedButton(text="送信", on_click=on_submit)
    page.add(submit_button)

ft.app(target=main)


実行画面

実行画面

  • 日付、内容、メンバーにチェックを入れ、「送信」を押すと出来上がったファイルのフルパスが下部に表示されます。

出来上がったエクセル

エクセル

  • 無事にエクセルが出来上がったので、エクスポートしてPDFを作成し、完了です。

まとめ

いかがでしたでしょうか?

エクセルのフォーマットによっては、使えるスクリプトになったのではないかと思います。

もっと沢山入力項目がある場合は、CSVファイルから読み込む等の実装も良いかと思います。

是非ご活用ください。


AI関連は日進月歩、日々之精進でございます。

最後まで読んで頂きありがとうございました。

AIさはら


頭の体操:解答

  • わかりましたか?

解答


本日のAI着物美女

AI着物美女

Instagram

良かったらInstagramのフォローをお願いします。

https://www.instagram.com/ai_kimono_bijo/

非アダルトで運営しておりますので、職場でも安心して堪能いただけます。