如何使用python tkinter可执行文件创建word文档?

时间:2019-07-10 20:32:43

标签: python tkinter pyinstaller python-docx docx-mailmerge

我正在尝试创建一个python tkinter可执行文件,该可执行文件显示来自Oracle数据库的信息,并且还可以将该信息导出到MS Word(.docx)文档中。在Excel中也是如此。

当前,每当我通过PyCharm运行脚本时,就能够创建一个新的Word文档和一个新的Excel电子表格;但是,在使用pyinstaller创建可执行文件之后,我无法导出新的Word文档,但可以导出新的Excel电子表格。

我认为我要么需要找到一些未知的Word模块,才能真正创建Word文档,就像xlsxwriter创建Excel工作表的方法一样;或者我需要以某种方式将Word文件捆绑到可执行文件中。

Python 3.7,PyCharm 2019.1.1社区版。 模块-tkinter,python-docx,docx-mailmerge,xlsxwriter,pyinstaller

我当时使用docx-mailmerge并将数据合并到Word文档模板中,但是后来我尝试使用python-docx尝试“创建”自己的Word文档。 (摘自python-docx的文档:“实际上,它只能让您对现有文档进行更改;只是,如果您从不包含任何内容的文档开始,一开始可能会感觉就像在创建一个文档。从头开始。”)

我尝试使用pyinstaller创建文件夹分发和单文件可执行文件。我认为我最好的选择是创建一个文件夹,然后手动将Word模板添加到某些子文件夹中,但是我不知道哪个。如果是这样,我相信我可以使用任一Word模块。

我可以使用xlsxwriter导出Excel电子表格,没问题。

我添加了一条try / except语句来捕获错误(并在应用程序中添加了一个标签,以显示错误名称),然后遍历了python文档中的整个异常列表,但仅捕获了所有“除了:”会抓到。

def data_pull(user, pw, _id):
    # connects to oracle and pulls data into a list

class App(Frame):
    # a login frame not shown
    # self.create_widgets()

    def create_widgets(self):
        # various StringVar() variables
        # oracle data entry query (=_id)
        # Button that calls entry query
        # frames and scrolledtext for displaying the data
        # Button to export to word
        # Button to export to excel

     def word_export(self, lst, path):
        # export using python-docx

     def excel_export(self, lst, path):
        # export using xlsxwriter

     def entry_callback(self):
        # a = data_pull(user, pw, _id)
        # parse a into a long string
        # pass string to scrolledtext widget

从PyCharm内部运行此文件时,创建Word文档没有问题,但是从可执行文件运行时,则没有任何反应。

1 个答案:

答案 0 :(得分:1)

正如评论中已经提到的那样,问题是当您尝试使用python-docx时,它实际上具有一些与python不相关的template files,因此PyInstaller无法识别它们,因此它们是在最终的可执行文件中丢失。

在这种情况下,一种简单的方法就是嵌入整个依赖目录。您需要使用Tree class并添加docx的模板路径(请记住将./env/Lib/site-packages/docx/templates替换为系统上的正确路径):

a = Analysis(
...
a.datas += Tree("./env/Lib/site-packages/docx/templates", prefix='docx/templates')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
...