慕桂英3389331
2023-03-08 16:06:28
我有一些 Access 格式的報告,我想從 Python 腳本生成這些報告的 PDF。我閱讀了很多關于如何做到這一點的問題和答案,并想出了這個簡單的腳本。我的代碼是:import win32com.client as winimport osaccess = win.Dispatch("Access.Application")db = access.OpenCurrentDatabase(filename)access.DoCmd.OpenReport(report_name,2)access.DoCmd.OutputTo(3, report_name, r'PDF Format (*.pdf)','c:/temp/test.pdf' )access.DoCmd.CloseDatabaseaccess.Quit()access=None第一次執行腳本會出現此錯誤(幫我翻譯成英文):pywintypes.com_error: (-2147352567, 'An exception occurred.', (0, None, ' Cannot execute this action now.', None, -1, -2146825802), None)并且文件訪問是打開的。我第二次執行時,它說The database is already open. 當我關閉 Access 并執行它時再次出現第一個錯誤。更新:現在我更改了我的代碼以在腳本執行時關閉數據庫,這是我第二次執行,然后腳本工作正常。import win32com.client as winimport osimport timedef file_open(file_name): if os.path.exists(file_name): try: os.rename(file_name, file_name) #can't rename an open file so an error will be thrown return False except: print("File Open "+file_name) time.sleep(2) file_open(file_name) return True else: return False raise NameErroraccess = win.Dispatch("Access.Application")file_open(filename)db = access.OpenCurrentDatabase(filename)access.DoCmd.OpenReport(report_name,2)if os.path.isfile('c:/temp/test.pdf'): os.remove('c:/temp/test.pdf')access.DoCmd.OutputTo(3, report_name, r'PDF Format (*.pdf)','c:/temp/test.pdf' )access.DoCmd.CloseDatabaseaccess.Quit()access=None正確執行后,如果我再執行一次,我會遇到第一個錯誤。我第二次執行,然后再次正常工作。
1 回答

肥皂起泡泡
TA貢獻1829條經驗 獲得超6個贊
最后我找到了這個解決方案。這不是更好,但它有效。如果有人有更好的解決方案,請現在告訴我。
解決方案是在 Windows 中殺死 MSACCESS 進程。
這是我的代碼:
import win32com.client as win
import os
access = win.Dispatch("Access.Application")
db = access.OpenCurrentDatabase(filename)
access.DoCmd.OpenReport(report_name,2)
if os.path.isfile('c:/temp/test.pdf'): # Delete previous PDF
os.remove('c:/temp/test.pdf')
access.DoCmd.OutputTo(3, report_name, r'PDF Format (*.pdf)','c:/temp/test.pdf' )
access.DoCmd.CloseDatabase
os.system("taskkill /im MSACCESS.exe") # Kill process in wondows
添加回答
舉報
0/150
提交
取消