Python 使用 win32com.client 导出报表 Microsoft Access
Python Export Report Microsoft Access using win32com.client
我有一些 Access 格式的报告,我想从 Python 脚本生成这些报告的 PDF。
我阅读了很多关于如何做到这一点的问题和答案,并想出了这个简单的脚本。
我的代码是:
import win32com.client as win
import os
access = 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.CloseDatabase
access.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 win
import os
import time
def 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 NameError
access = 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.CloseDatabase
access.Quit()
access=None
正确执行后,如果我再执行一次,就会出现第一个错误。我第二次执行,然后再次正常工作。
我终于找到了这个解决方案。这不是更好,但它有效。如果有人有更好的解决方案请告诉我。
解决方法是在 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
我有一些 Access 格式的报告,我想从 Python 脚本生成这些报告的 PDF。
我阅读了很多关于如何做到这一点的问题和答案,并想出了这个简单的脚本。
我的代码是:
import win32com.client as win
import os
access = 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.CloseDatabase
access.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 win
import os
import time
def 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 NameError
access = 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.CloseDatabase
access.Quit()
access=None
正确执行后,如果我再执行一次,就会出现第一个错误。我第二次执行,然后再次正常工作。
我终于找到了这个解决方案。这不是更好,但它有效。如果有人有更好的解决方案请告诉我。
解决方法是在 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