「さはら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)
解説
- まず、サンプルのエクセルファイルを用意します。
- パッケージ等のインストール・環境設定
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着物美女
良かったらInstagramのフォローをお願いします。
https://www.instagram.com/ai_kimono_bijo/
非アダルトで運営しておりますので、職場でも安心して堪能いただけます。