使用PyExcel无法在PyInstaller捆绑exe(Windows)上运行时写入Excel文件会写入空损坏的文件

时间:2019-05-22 23:55:25

标签: python windows pyinstaller python-3.7 pyexcel

我正在使用PyExcel及其ODS和XLSX插件将数据写入LibreOffice和Excel工作表。在Python解释器上执行时,该程序运行良好,但是当我从PyInstaller可执行文件执行程序时,我只是发现它不起作用(我在Windows 10上工作)。更具体地说,创建了文件,但它们似乎已损坏(格式无法识别的0kB文件),但在输出控制台或PyInstaller生成过程中均未显示任何错误消息。我设法创建了一个最小的示例来确切说明问题所在。

首先,它使用Python 3.7.3,PyInstaller 3.4和带有插件的最新PyExcel版本。另外,我需要pywin32库才能使PyInstaller工作。我将在此处复制最小示例的代码,包括用于构建exe文件的控制台脚本。如前所述,它可以在Python解释器上完美运行,但是生成的可执行文件只能写入损坏的文件。

-open_dialog.py-

from tkinter import filedialog


def open_dialog():
    file = filedialog.asksaveasfile(mode='wb',
                                       title='Export',
                                       defaultextension='xlsx',
                                       filetypes=([("XLSX", ".xlsx"),
                                         ("ODS", ".ods"),
                                         ("All files", ".*")])
                                       )
    if file is None:
        raise Exception()

    return file

-main.py-

from collections import OrderedDict

import pyexcel

from open_dialog import open_dialog

try:
    with open_dialog() as file:

        sheet_1 = []
        sheet_1.append(['Sheet 1'])
        sheet_1.append([''])

        sheet_2 = []
        sheet_2.append(['Sheet 2'])
        sheet_2.append([''])

        book = OrderedDict()
        book["Sheet 1"] = sheet_1
        book["Sheet 2"] = sheet_2
        book_excel = pyexcel.get_book(bookdict=book)

        book_excel.save_as(file.name)

except Exception:
    print("Failed to write file")

-build_windows.bat-

set PYTHONPATH=.
PyInstaller "main.py" ^
--name "test" ^
--clean ^
--distpath "exe" ^
--hidden-import pyexcel ^
--hidden-import pyexcel.plugins.renderers.excel ^
--hidden-import pyexcel.plugins.renderers._texttable ^
--hidden-import pyexcel.plugins.parsers.excel ^
--hidden-import pyexcel.plugins.sources.http ^
--hidden-import pyexcel.plugins.sources.file_input ^
--hidden-import pyexcel.plugins.sources.memory_input ^
--hidden-import pyexcel.plugins.sources.file_output ^
--hidden-import pyexcel.plugins.sources.output_to_memory ^
--hidden-import pyexcel.plugins.sources.pydata.bookdict ^
--hidden-import pyexcel.plugins.sources.pydata.dictsource ^
--hidden-import pyexcel.plugins.sources.pydata.arraysource ^
--hidden-import pyexcel.plugins.sources.pydata.records ^
--hidden-import pyexcel_io ^
--hidden-import pyexcel_io.readers ^
--hidden-import pyexcel_io.writers ^
--hidden-import pyexcel_io.database ^
--hidden-import pyexcel_io ^
--hidden-import pyexcel_ods ^
--hidden-import pyexcel_ods.odsw ^
--hidden-import pyexcel_xlsx ^
--hidden-import pyexcel_xlsx.xlsxw ^

我不确定是否丢失了一些重要的隐藏内容或实际发生的情况。如果有人可以帮助我解决这个问题,那将非常有用。预先感谢。

EDIT :添加行

traceback.print_exc()

except 块中的

表示实际上正在引发异常:

pyexcel_io.exceptions.SupportingPluginAvailableButNotInstalled: Please install one of these plugins for write data in 'xlsx': pyexcel-xlsx,pyexcel-xlsxw

所以,即使我指示隐藏的导入,它实际上也没有检测到插件。我很困惑。

1 个答案:

答案 0 :(得分:0)

我只是通过在代码中明确导入插件来实现此目的。

@foreach ($books as $book)
        <li>{{ $book->title }} by {{print implode(', ', $book->author)}}</li>
    @endforeach

这似乎有点丑。