Pythonにて暗号化されたエクセルファイルを開き、ファイルの中身を更新し、保存するというアプリを作成したいのですが、エラーが発生し、うまくいきません。
例として、同様のエラーが発生する簡単なプログラム(エクセルファイルの"B2"に"1"を入力する)を作りました。ソースコードとエラー内容は下記の通りです。具体的な対処方法を教えていただけないでしょうか。
よろしくお願いします。
※なお、親モジュール(gui2.py)にて、子のエクセル更新モジュール(main2.py)を呼び出して実行するという関係性は変更しない方針でご教授いただけると幸いです。
※子のエクセル更新モジュール(main2.py)は定刻にファイルを更新するという機能をもっていますが、この機能も残したいです。
※エクセル(test.xlsx)の書き込みパスワードは"abcd"です。
※環境はWindows10 Pro、Pythonのバージョンは3.9です。
python
1# <親モジュール(gui2.py)> 2 3import PySimpleGUI as sg 4import threading 5import time 6import main2 7 8# レイアウト 9layout = [ 10 [sg.Text('実行ボタンを押してください')], 11 [sg.Submit(button_text='実行', size=(20,1))], 12] 13 14# ウィンドウの生成 15window = sg.Window('エクセル更新アプリ', layout) 16 17# 変数の定義 18thread=None 19 20# イベントループ 21while True: 22 event, values = window.read() 23 24 if event is None: 25 print('exit') 26 break 27 28 elif event=='実行': 29 #二重実行防止 30 if not thread: 31 thread = threading.Thread(target=main2.sub, daemon=True) 32 thread.start() 33 print('実行完了') 34 35# ウィンドウの破棄と終了 36window.close()
python
1# <子モジュール(main2.py)> 2import datetime as dt 3import schedule 4import time 5import openpyxl as excel 6import msoffcrypto 7 8def sub(): 9 def job(): 10 # 暗号化されたExcelファイルを指定 11 fin = open("test.xlsx","rb") 12 msfile = msoffcrypto.OfficeFile(fin) 13 # パスワードを指定 14 msfile.load_key(password="abcd") 15 # 復号化したファイルを保存 16 fout = open("test.xlsx","wb") 17 msfile.decrypt(fout) 18 19 # ワークブックを開いて内容を更新、保存 20 book=excel.load_workbook("test.xlsx") 21 sheet=book.active 22 sheet["B2"].value=1 23 book.save("test.xlsx") 24 25 # スケジューラーへのジョブ登録 26 schedule.every().day.at("08:00").do(job) 27 28 29 while True: 30 schedule.run_pending() 31 time.sleep(5)
<エラー内容>
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\threading.py", line 954, in _bootstrap_inner
self.run()
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\threading.py", line 892, in run
self._target(*self.args, **self.kwargs)
File "C:\Users\kaish\OneDrive\デスクトップ\TEST\main2.py", line 25, in sub
schedule.run_pending()
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule_init.py", line 780, in run_pending
default_scheduler.run_pending()
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule_init.py", line 100, in run_pending
self.run_job(job)
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule_init.py", line 172, in run_job
ret = job.run()
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\site-packages\schedule_init.py", line 661, in run
ret = self.job_func()
File "C:\Users\kaish\OneDrive\デスクトップ\TEST\main2.py", line 13, in job
msfile.decrypt(fout)
File "C:\Users\kaish\AppData\Local\Programs\Python\Python39\lib\site-packages\msoffcrypto\format\ooxml.py", line 188, in decrypt
if not zipfile.is_zipfile(io.BytesIO(obuf)):
UnboundLocalError: local variable 'obuf' referenced before assignment
回答2件
あなたの回答
tips
プレビュー