Сохранение файла Excel из скрипта Python с использованием библиотеки win32com

128
14

Я использую библиотеку win32com.client, чтобы открыть файл xlsm и сохранить его в файл xls. Да, я знаю, что некоторые могут поставить вопрос о том, что сохранение в старый формат не следует делать, но это является требованием бизнеса - получатели файлов в основном используют старые версии Excel, поэтому преобразование их в новую не является вариантом.

Возвращаясь к проблеме. Код, который выполняет преобразование, выглядит следующим образом:

excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(self.dicData["report_file_xlsm"])
excel.DisplayAlerts = False
wb.DoNotPromptForConvert = True
wb.CheckCompatibility = False
wb.SaveAs(r'output.xls', FileFormat=56, ConflictResolution=2)
excel.Application.Quit()

и это работает. Однако я хотел бы заменить выходной путь на значения, сгенерированные скриптом, в виде фиксированного пути к выходной папке плюс сгенерированное имя выходного файла. Путь к выходной папке хранится в json, который читается при запуске скрипта, а в файле json это выглядит так:

C:\\DATA\\Program\\Output

этот файл также генерируется автоматически командой

os.getcwd()

Окончательная версия команды сохранения как должна выглядеть

wb.SaveAs(output_file, FileFormat=56, ConflictResolution=2)

где output_file - строковая переменная, созданная путем объединения выходного пути с именем выходного файла, созданного сценарием. Проблема в том, что эта форма команды сохранения как генерирует исключение:

(-2147352567, 'Exception occurred.', (0, 'Microsoft Excel',
"'C:\\//DATA/Program/Output/' cannot be accessed. The file may be
corrupted, located on a server that is not responding, or read-only.",
'xlmain11.chm', 0, -2146827284), None)

Это немного странно для меня, как команда открытия:

wb = excel.Workbooks.Open(self.dicData["report_file_xlsm"])

где входной файл представлен также в виде словарной записи строкового типа, работает без проблем.

спросил(а) 2019-05-02T13:00:00+03:00 1 год, 5 месяцев назад
1
Решение
81

Проблема решена с помощью библиотеки pathlib.

переменная output_file создается с помощью следующей команды

output_file = pathlib.Path('{}\{}.xls'.format(output_folder,output_file_name)

а затем переменная output_file используется следующим образом

wb.SaveAs(str(output_file), FileFormat=56, ConflictResolution=2)

Я не знаю, является ли это наиболее правильным решением, но оно работает.

ответил(а) 2019-05-02T14:14:00+03:00 1 год, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема