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

Posted

技术标签:

【中文标题】Python 导出报告 Microsoft Access 使用 win32com.client【英文标题】:Python Export Report Microsoft Access using win32com.client 【发布时间】:2020-07-14 08:10:45 【问题描述】:

我有一些 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

在正确执行之后,如果我再次执行,我会遇到第一个错误。我第二次执行,然后再次正常工作。

【问题讨论】:

【参考方案1】:

我终于找到了这个解决方案。这不是更好,但它有效。如果有人有更好的解决方案,请现在告诉我。

解决办法是在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

【讨论】:

以上是关于Python 导出报告 Microsoft Access 使用 win32com.client的主要内容,如果未能解决你的问题,请参考以下文章

将访问报告导出为 PDF

python(unittest)报告导出:使用 BeautifulReport导出

移动测试之appium+python 导出报告

selenium(python)用HTMLTestRunner导出报告(断言)信息的显示

基于Microsoft.Office.Interop.Word的替换文字

如何在python中用markdown语言写一份报告并输出成PDF格式