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 件のコメント:
コメントを投稿