適当なテンプレートを探します。
今回は、以下のExcelブックを有難く使わせていただきます。ありがとうございます。
エクセルカレンダーテンプレート | アラクネ (arachne.jp)
ユーザフォーマットとしては、3行に渡るものが必要でした。上記フォーマットは、最大6行まで可能です。
これに、短時間宿直もあるので、出来れば4行以上のものが必要でした。
<シート名の作成>
「2024年6月」のような名前になっているので、プロジェクト処理月に応じてシート名を作成する必要があります。年月日情報は、ソース全体の最初の方、daydefでリストとして作成されています。制約開始日でインデックスすると、当該年月日がフォーマット文字列として取り出すことが出来ます。
def post_mainがポスト処理のメインになります。
python ソースは以下です。以下を参考にしました。このテンプレートでは、Dayが数値として定義されていません。検索がうまく動かないので、日曜日基準のカレンダを内部で持って、それをExcelシートフォーマットに展開する方法を取りました。このプロジェクトは、クリアするだけの機能しかありませんが、後々これを基に解を出力していきます。
import sc3 import sys import os import csv import re import win32gui, win32con import datetime import calendar def get_sheet_name(): s=daydef[制約開始日] year_str=s[0:4] month=int(s[5:7]) sheet_name=year_str+'年'+str(month)+'月' return sheet_name def get_year(): s=daydef[制約開始日] year_str=s[0:4] return int(year_str) def get_month(): s=daydef[制約開始日] month=int(s[5:7]) return month def get_day(): s=daydef[制約開始日] day=int(s[8:10]) return day def find_address(moncal,D): row=0 for r in moncal: if D not in r: row+=1 continue return (row,r.index(D)) raise IndexError def init_row_columns(): global start_row global start_column global row_interval global column_interval start_row=5 start_column=2 row_interval=6 column_interval=2 def findcell(ws,moncal,D): tuple=find_address(moncal,D) init_row_columns() row=start_row+row_interval*tuple[0] column=start_column+column_interval*tuple[1] return (row,column) def clear_cells(ws): init_row_columns() for r in range(6): for d in range(7): row=start_row+r*row_interval column=start_column+d*column_interval print(row,column) ws.Cells(row ,column+1).Value="" ws.Cells(row+1,column+1).Value="" ws.Cells(row+2,column+1).Value="" ws.Cells(row+3,column).Value="" ws.Cells(row+4,column).Value="" ws.Cells(row+5,column).Value="" def post_main(): print('\n\n*********ポスト処理を実行中です。*************\n') import win32com.client#pywin32をインポート #すでにExcelが起動されている場合はそのタスクが使われる #エラー終了するとタスクは残ります try : excel = win32com.client.Dispatch("Excel.Application") except: print("can not invoke excel") exit() #動いている様子を見てみる excel.Visible = True os.chdir(project_file_path) filename="2024勤務表.xlsx" file=os.path.join(project_file_path,filename) file.replace("/","\\") sheet_name=get_sheet_name() try: wb = excel.Workbooks.Open(file) # Excelシートオブジェクト ws = wb.Worksheets(sheet_name) except: print("Can not open the excel file.") wb.Close() excel.Quit() # 指定したシートを選択 # Select()の使用前にシートのActivate()が必要 ws.Activate() calendar.setfirstweekday(6)#日曜日を最初に mon_cal=calendar.monthcalendar(get_year(),get_month())#行列でリスト print(findcell(ws,mon_cal,1)) clear_cells(ws) wb.Close(True)# Trueで保存。False=Defaultでブックを保存せずにクローズ # Excel終了 excel.Quit() print('\n\n*********ポスト処理を実行終了しました。*************\n')
0 件のコメント:
コメントを投稿