Python Экспорт отчета Microsoft Access с использованием win32com.client - PullRequest
0 голосов
/ 14 июля 2020

У меня есть несколько отчетов в формате Access, и я хочу сгенерировать эти отчеты в формате PDF из сценария Python.

Я прочитал много вопросов и ответов о том, как это сделать, и придумал этот простой script.

Мой код:

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

Выполнение сценария в первый раз дает эту ошибку (переведите для меня на английский sh):

pywintypes .com_error: (-2147352567, 'Произошло исключение.', (0, Нет, 'Невозможно выполнить это действие сейчас.', Нет, -1, -2146825802), Нет)

И файл Доступ открыт.

Во второй раз, когда я выполняю, он говорит: 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 Ответ

0 голосов
/ 15 июля 2020

Наконец я нашел это решение. Не лучше, но работает. Если у кого-то есть лучшее решение, пожалуйста, позвольте мне сейчас.

Решение - убить процесс MSACCESS в windows.

Это мой код:

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
...