我正在尝试遍历包含多个xlsm(启用了宏的excel)文件的目录,打开每个文件并将其另存为xlsx文件。理想情况下,我将拥有三个目录,一个包含我的脚本,一个保存未修改文件的目录,另一个保存修改后的文件的目录。
目录macro_dir包含:'test1.xlsm','test2.xlsm','test3.xlsm'
当我遍历目录中的每个文件时,我的代码无法正常工作。代码块A(如下)起作用:在excel.Workbooks.Open方法中,文件变量是xlsm文件之一的绝对路径,而wb.SaveAs方法包含具有新文件名和扩展名的绝对路径。
A。工作代码:
function sumOfMultiples(number) {
let numb = [5, 10, 12];
let sum = 0;
for (let x=0; x<=numb.length; x++){
for (let i=0; i<number; i++) {
if(i % numb === 0){
sum += i;
}
}
return sum;
}
}
B。我试图将其变成循环:
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(在上面)修改每个.xlsm文件,并将它们另存为.xlsx到同一目录。但是,代码会产生以下错误:
com_error:(-2147352567,“发生异常。”,(0,“ Microsoft Excel”,“对不起,我们找不到test1.xlsm。是否有可能将其移动,重命名或删除?”,'xlmain11 .chm',0,-2146827284),无)
编辑:我不能简单地更改文件扩展名,必须通过在excel中打开文件并将其另存为.xlsx来转换文件格式
答案 0 :(得分:1)
是您的for循环导致错误,而不是win32com
。您没有使用完整路径。
这应该解决它。
for file in os.listdir(dir):
file = os.path.join(dir, file)
wb = excel.Workbooks.Open(file)
....