Как я могу итеративно изменять типы файлов Excel, используя win32com и os? - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь перебрать каталог, содержащий несколько файлов xlsm (с поддержкой макросов Excel), открывая каждый файл и сохраняя его как файл xlsx. В идеале, у меня должно быть три каталога: один, в котором хранится мой сценарий, один, в котором находятся немодифицированные файлы, и другой, где будут сохранены измененные файлы.

Каталог macro_dir содержит: 'test1.xlsm', 'test2.xlsm', 'test3.xlsm'

Я не могу заставить мой код работать, когда я перебираю каждый файл в каталоге. Блок кода A (ниже) работает: в методе excel.Workbooks.Open файловая переменная представляла собой абсолютный путь к одному из файлов xlsm, а метод wb.SaveAs содержал абсолютный путь с новым именем файла и расширением.

A. Рабочий код:

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')

wb = excel.Workbooks.Open(r'C:\Users\Documents\macro_dir\test1.xlsm')
excel.DisplayAlerts = False
wb.DoNotPromptForConvert = True
wb.CheckCompatibility = False
wb.SaveAs(r'C:\Users\Documents\macro_dir\output1.xlsx', FileFormat=51, ConflictResolution=2)
excel.Application.Quit()

B. Моя попытка превратить это в цикл:

import os
import win32com.client as win32

dir = r'C:\Users\Documents\macro_dir'

excel = win32.gencache.EnsureDispatch('Excel.Application')

for file in os.listdir(dir):
    wb = excel.Workbooks.Open(file)
    excel.DisplayAlerts = False
    wb.DoNotPromptForConvert = True
    wb.CheckCompatibility = False
    wb.SaveAs(file[:-4] + 'xlsx', FileFormat=51, ConflictResolution=2)
    excel.Application.Quit()

Я ожидал, что блок кода B (выше) изменит каждый файл .xlsm и сохранит их как .xlsx в том же каталоге. Однако код выдает следующую ошибку:

com_error: (-2147352567, «Возникло исключение.», (0, «Microsoft Excel», «Извините, мы не смогли найти test1.xlsm. Возможно, он был перемещен, переименован или удален?», «Xlmain11» .chm ', 0, -2146827284), нет)

РЕДАКТИРОВАТЬ: я не могу просто изменить расширение файла, формат файла должен быть преобразован, открыв файл в Excel и сохранив его как .xlsx

1 Ответ

1 голос
/ 13 мая 2019

Ваш цикл for вызывает ошибку, а не win32com.Вы не используете полный путь.

Это должно исправить это.

for file in os.listdir(dir):
    file = os.path.join(dir, file)
    wb = excel.Workbooks.Open(file)
    ....
...