2024年12月28日土曜日

Q. 2025 1月当直拘束表は、1月6日スタートですが、Excel出力が1日からにズレる

 Ans. 申し訳ございません。Python記述にバグがありました。

<変更前>

def get_sheet_name():
    s=daydef[制約開始日]

    year_str=s[0:4]
    month=int(s[5:7])
    sheet_name=year_str+'年'+str(month)+'月'
    print("シート名=",sheet_name)
    return sheet_name

def get_year():
    s=daydef[制約開始日]
    year_str=s[0:4]
    return int(year_str)
def get_year_str():#DEC202024 追加
    s=daydef[制約開始日]
    year_str=s[0:4]
    return 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))
    #次月最初の日:最終行の最終列+1を出す
    tuple=find_address(moncal,D-14)
    row=tuple[0]+2
    col=tuple[1]
    
    print("find_address",row,col)
    return (row,col)
    raise IndexError

def init_row_columns():
    global start_row
    global start_column
    global row_interval
    global column_interval

    start_row=6
    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]
    c=namedtuple("Row","Column")
    c.Row=row
    c.Column=column
    return c

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  ,column).Value=""
            ws.Cells(row+1,column+1).Value=""
            ws.Cells(row+1,column).Value=""
            ws.Cells(row+2,column+1).Value=""
            ws.Cells(row+2,column).Value=""
            ws.Cells(row+3,column).Value=""
            ws.Cells(row+4,column).Value=""





def post_main():
    
    print('\n\n*********ポスト処理を実行中です。*************\n')
    import win32com.client#pywin32をインポート

#すでにExcelが起動されている場合はそのタスクが使われる
#エラー終了するとタスクは残ります
    try :
        xl = win32com.client.Dispatch("Excel.Application")
    except:
        print("can not invoke excel")
        exit()
    #動いている様子を見てみる
    xl.Visible = False
    #file=get_open_file_name("Open Excel File")
    #print(file)
    os.chdir(project_file_path)
    filename=get_year_str()+"当直拘束表.xlsx";##DEC202024 BUG FIX "2024当直拘束表.xlsx"
   
    file=os.path.join(project_file_path,filename)
    file1=file.replace("/","\\") #なぜか逆スラッシュでないと動かない
    print(file1)
    wb = xl.Workbooks.Open(file1)
    # Excelシートオブジェクト
    ws = wb.Worksheets(get_sheet_name())

    # 指定したシートを選択
    # Select()の使用前にシートのActivate()が必要
    ws.Activate()

    calendar.setfirstweekday(6)#日曜日を最初に
    mon_cal=calendar.monthcalendar(get_year(),get_month())#行列でリスト

    print(findcell(ws,mon_cal,1))

    clear_cells(ws)


    for day in 今月区間:
        D=day-制約開始日+1
        print(D)
        c=findcell(ws,mon_cal,D)
        n=findcell(ws,mon_cal,D+1)
        #print(c.Row,c.Column)
        day_solution_analysis(ws,c,n,day)

    wb.Close(True)# Trueで保存。False=Defaultでブックを保存せずにクローズ
    # Excel終了
    xl.Quit()
    print('\n\n*********ポスト処理を実行終了しました。*************\n')

 
<変更後記述>
def get_sheet_name():
    s=daydef[制約開始日]

    year_str=s[0:4]
    month=int(s[5:7])
    sheet_name=year_str+'年'+str(month)+'月'
    print("シート名=",sheet_name)
    return sheet_name

def get_year():
    s=daydef[制約開始日]
    year_str=s[0:4]
    return int(year_str)
def get_year_str():#DEC202024 追加
    s=daydef[制約開始日]
    year_str=s[0:4]
    return 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))
    #次月最初の日:最終行の最終列+1を出す
    tuple=find_address(moncal,D-14)
    row=tuple[0]+2
    col=tuple[1]
    
    print("find_address",row,col)
    return (row,col)
    raise IndexError

def init_row_columns(ws):#DEC272024
    global start_row
    global start_column
    global row_interval
    global column_interval
    test_range= ws.Range("A1:C9")#DEC272024    
    ### example if you want to find out the column of search result
    #ResultColumn= test_range.Find("Series ID").Column 
    #print(str(ResultColumn))
    sun=test_range.Find("日")#DEC
 
    print("日アドレス=",sun.Row,sun.Column)
    start_row=sun.Row+2# 6
    start_column=sun.Column#2
    row_interval=6
    column_interval=2

def findcell(ws,moncal,D):
    tuple=find_address(moncal,D)
    init_row_columns(ws)
    row=start_row+row_interval*tuple[0]
    column=start_column+column_interval*tuple[1]
    c=namedtuple("Row","Column")
    c.Row=row
    c.Column=column
    return c

def clear_cells(ws):
    init_row_columns(ws)
    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  ,column).Value=""
            ws.Cells(row+1,column+1).Value=""
            ws.Cells(row+1,column).Value=""
            ws.Cells(row+2,column+1).Value=""
            ws.Cells(row+2,column).Value=""
            ws.Cells(row+3,column).Value=""
            ws.Cells(row+4,column).Value=""





def post_main():
    
    print('\n\n*********ポスト処理を実行中です。*************\n')
    import win32com.client#pywin32をインポート

#すでにExcelが起動されている場合はそのタスクが使われる
#エラー終了するとタスクは残ります
    try :
        xl = win32com.client.Dispatch("Excel.Application")
    except:
        print("can not invoke excel")
        exit()
    #動いている様子を見てみる
    xl.Visible = False
    #file=get_open_file_name("Open Excel File")
    #print(file)
    os.chdir(project_file_path)
    filename=get_year_str()+"当直拘束表.xlsx";##DEC202024 BUG FIX "2024当直拘束表.xlsx"
   
    file=os.path.join(project_file_path,filename)
    file1=file.replace("/","\\") #なぜか逆スラッシュでないと動かない
    print(file1)
    wb = xl.Workbooks.Open(file1)
    # Excelシートオブジェクト
    ws = wb.Worksheets(get_sheet_name())

    # 指定したシートを選択
    # Select()の使用前にシートのActivate()が必要
    ws.Activate()

    calendar.setfirstweekday(6)#日曜日を最初に
    mon_cal=calendar.monthcalendar(get_year(),get_month())#行列でリスト

    print(findcell(ws,mon_cal,1))

    clear_cells(ws)


    for day in 今月区間:
        #D=day-制約開始日+1
        D=day-制約開始日+get_day()#DEC272024 BUG FIX
        #print(D)
        c=findcell(ws,mon_cal,D)
        n=findcell(ws,mon_cal,D+1)
        print("Day=",D,c.Row,c.Column)
        day_solution_analysis(ws,c,n,day)

    wb.Close(True)# Trueで保存。False=Defaultでブックを保存せずにクローズ
    # Excel終了
    xl.Quit()
    print('\n\n*********ポスト処理を実行終了しました。*************\n')

 
mainのDの記述を暦日に修正しました。また、init_row_columnsで、日曜日の「日」を検索・検出してそれを基準に
Excelデータを記述するように変更しました。




0 件のコメント:

コメントを投稿