我有一個 Excel 檔案,里面有一堆公式。正確加載公式需要時間(~1-2 分鐘),所以我試圖在打開檔案和保存加載的檔案之間添加一些延遲。完成此操作后,我希望將完全加載的 Excel 檔案的副本保存為具有不同名稱的新 CSV,以便我同時擁有完全加載的 Excel 檔案和新的 CSV 檔案。
需要明確的是,我正在嘗試按此順序執行以下任務:
- 打開 Excel 檔案
- 添加一些延遲(約 1-2 分鐘長)
- 保存完全加載的 Excel 檔案
- 將完全加載的 Excel 檔案的副本另存為具有不同名稱的 CSV
我已經成功地完成了第 1 步和第 3 步,如下所示,但是在第 2 步和第 4 步時遇到了問題。我注意到第 2 步非常重要,因為我現在撰寫代碼的方式不允許有足夠的時間要加載的公式,導致檔案加載不完整。
執行第 2 步和第 4 步的最佳方法是什么,即添加延遲然后將完整檔案另存為 CSV?
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
#opens file denoted by PATH
workbook = excel.Workbooks.Open(PATH)
#saves file
workbook.Save()
#closes and quits Excel
workbook.Close()
excel.Quit()
請注意,此代碼基于此帖子。
uj5u.com熱心網友回復:
您可以開始 Excel 計算,然后讓您的 Python 代碼等待:
import time
#...
workbook = excel.Workbooks.Open(PATH)
excel.CalculateFull() #If Calculation is set to Manual
#Wait 10 seconds
time.sleep(10)
workbook.Save()
#...
當然,你不知道 10 秒是等待的時間太長還是太短。
更精確的方法是開始計算,然后等待 Excel 告訴您計算已完成。Excel Application 物件AfterCalculation在完成計算樹時發出一個事件信號。您可以將 Python 代碼設定為在繼續之前等待此事件發出信號。
完整代碼:
import win32com.client as wc
import pythoncom #From package pywin32
import win32api
import win32con
from os.path import join
#Class to handle the SyncObject events from Outlook
class CalcHandler(object):
def OnAfterCalculate(self):
#Calculation has finished so send WM_QUIT to message loop
win32api.PostThreadMessage(win32api.GetCurrentThreadId(), win32con.WM_QUIT, 0, 0)
print('... calculation complete')
#Get the application Dispatch interface
xl = wc.gencache.EnsureDispatch('Excel.Application')
path = 'path_to_directory'
#opens a file
workbook = xl.Workbooks.Open(join(path,'test.xlsx'))
if workbook is not None:
#Create an event handler
wc.WithEvents(xl,CalcHandler)
print('Starting calculation ...')
#Force a calcuation
xl.CalculateFull()
#This will block until a WM_QUIT message is sent to the message queue
pythoncom.PumpMessages()
#saves file as a CSV
xl.DisplayAlerts=False
workbook.SaveAs(join(path,'test.csv'),wc.constants.xlCSV)
#closes and quits Excel
workbook.Close()
if xl.Workbooks.Count == 0:
xl.Quit()
xl=None
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/365292.html
