Сохранение файла Excel из скрипта Python с использованием библиотеки win32com - PullRequest
0 голосов
/ 02 мая 2019

Я использую библиотеку 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"])

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

1 Ответ

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

Проблема решена с помощью библиотеки 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)

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

...