如何使用 win32com 和 os 迭代修改 excel 文件类型?
How can I iteratively modify excel filetypes using win32com and os?
我正在尝试遍历包含许多 xlsm(启用宏 excel)文件的目录,打开每个文件并另存为 xlsx 文件。理想情况下,我会拥有三个目录,一个存放我的脚本,一个存放未修改的文件,另一个存放修改后的文件。
目录 macro_dir 包含:'test1.xlsm'、'test2.xlsm'、'test3.xlsm'
当我遍历目录中的每个文件时,我的代码无法工作。代码块 A(如下)有效:在 excel.Workbooks.Open 方法中,文件变量是其中一个 xlsm 文件的绝对路径,而 wb.SaveAs 方法包含具有新文件名和扩展名的绝对路径。
一个。工作代码:
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()
乙。我试图将其变成一个循环:
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, 'Exception occurred.', (0, 'Microsoft Excel', "Sorry, we couldn't find test1.xlsm. Is it possible it was moved, renamed or deleted?", 'xlmain11.chm', 0, -2146827284), None)
编辑:我不能简单地更改文件扩展名,必须通过在 excel 中打开文件并另存为 .xlsx
来转换文件格式
导致错误的是您的 for 循环,而不是 win32com
。您没有使用完整路径。
这应该可以解决问题。
for file in os.listdir(dir):
file = os.path.join(dir, file)
wb = excel.Workbooks.Open(file)
....
我正在尝试遍历包含许多 xlsm(启用宏 excel)文件的目录,打开每个文件并另存为 xlsx 文件。理想情况下,我会拥有三个目录,一个存放我的脚本,一个存放未修改的文件,另一个存放修改后的文件。
目录 macro_dir 包含:'test1.xlsm'、'test2.xlsm'、'test3.xlsm'
当我遍历目录中的每个文件时,我的代码无法工作。代码块 A(如下)有效:在 excel.Workbooks.Open 方法中,文件变量是其中一个 xlsm 文件的绝对路径,而 wb.SaveAs 方法包含具有新文件名和扩展名的绝对路径。
一个。工作代码:
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()
乙。我试图将其变成一个循环:
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, 'Exception occurred.', (0, 'Microsoft Excel', "Sorry, we couldn't find test1.xlsm. Is it possible it was moved, renamed or deleted?", 'xlmain11.chm', 0, -2146827284), None)
编辑:我不能简单地更改文件扩展名,必须通过在 excel 中打开文件并另存为 .xlsx
来转换文件格式导致错误的是您的 for 循环,而不是 win32com
。您没有使用完整路径。
这应该可以解决问题。
for file in os.listdir(dir):
file = os.path.join(dir, file)
wb = excel.Workbooks.Open(file)
....