Запись в файлы Excel с PyExcel не работает на PyInstaller в комплекте exe (Windows), пишет пустые поврежденные файлы - PullRequest
0 голосов
/ 23 мая 2019

Я использовал PyExcel с плагинами ODS и XLSX для записи данных на листы LibreOffice и Excel. Программа прекрасно работала при выполнении на интерпретаторе Python, но я обнаружил, что она не работает, когда я запускаю программу из исполняемого файла PyInstaller (я работаю в Windows 10). Точнее говоря, файлы создаются, но они кажутся поврежденными (файл 0 КБ в нераспознанном формате), но сообщения об ошибках не отображаются ни в консоли вывода, ни в процессе сборки 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 ^

Я не уверен, что мне не хватает какого-то важного скрытого импорта или что на самом деле происходит. Было бы очень полезно, если бы кто-то мог помочь мне взломать это. Заранее спасибо.

РЕДАКТИРОВАТЬ : добавление строки

traceback.print_exc()

внутри блока , за исключением , показал, что на самом деле возникает исключение:

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

Итак, на самом деле плагины не обнаруживаются, хотя я указываю скрытый импорт. Я в замешательстве.

1 Ответ

0 голосов
/ 23 мая 2019

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

import pyexcel_xlsx
import pyexcel_ods

Хотя это и выглядит некрасиво ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...