Я использую библиотеку 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"])
, где входной файл представлен также в виде словарной записи строкового типа, работает без проблем.