pythonコードのデバッグのためには、print()でオブジェクトを表示できたほうがよいので、coutをリダイレクトする処理を追加しました。これによりpythonと同じprint出力となります。sc3.print()は、文字列しか処理できないので今後obsoleteになります。
sc3.hook_stdout()がそのための文です。以下、python print()文による出力となります。
post_main()は、解が出た後に呼ばれます。解もpythonソースとしてアタッチしているので、解を整形して、Excelに出力させることが出来ます。ユーザ独自のExcelシートに直接書き込みます。
pythonソースは、Excelシートを読み込んで、名前を検索してprintするだけのサンプルです。Excelシートは、お医者さま用プロジェクトを独自に作成しました。
コンソールには、Findして得たreturnオブジェクトをprint()した出力が出ています。
Excelに渡すファイルパス名は、フルパスである必要は分かりますが、なぜか/ではダメで逆スラッシュにしないと動作しませんでした。
def post_main(): sc3.hook_stdout()#printをリダイレクトする 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 = True os.chdir(project_file_path) file=os.path.join(project_file_path,"excel_post_export.xlsx") file.replace("/","\\") #なぜか逆スラッシュでないと動かない wb = xl.Workbooks.Open(file) # Excelシートオブジェクト ws = wb.Worksheets(1) # 指定したシートを選択 # Select()の使用前にシートのActivate()が必要 ws.Activate() for person in 全スタッフ: staff_name=staffdef[person] c=ws.Range("B1:B51").Find(staff_name) print(c,c.address,end='\n') # ブックをクローズ wb.Close()# ブックを保存せずにクローズ # Excel終了 xl.Quit()
*********ポスト処理を実行中です。************* 部長1 $B$8 部長2 $B$12 部長(兼任) $B$16 副部長2 $B$20 副部長1 $B$24 医師2 $B$28 医師1 $B$32 新人医師2 $B$36 新人医師1 $B$40 解探索が終了しました。 7 (秒) 解が得られました。
0 件のコメント:
コメントを投稿