为了账号安全,请及时绑定邮箱和手机立即绑定

使用 win32com.client 的 Python 导出报告 Microsoft Access

使用 win32com.client 的 Python 导出报告 Microsoft Access

慕桂英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


查看完整回答
反对 回复 2023-03-08
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信