0

我正在尝试创建一个 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 文档的创建没有问题,但是当它从可执行文件运行时,什么也没有发生。

4

1 回答 1

1

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

在这些情况下,一个简单的方法就是嵌入整个依赖目录。您需要使用Tree 类并添加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)
...
于 2019-07-11T06:28:01.113 回答