在Excel VBA或Python中的文件夹和子文件夹中将xlsx文件转换为xls

在Excel VBA或Python中的文件夹和子文件夹中将xlsx文件转换为xls,python,excel,vba,Python,Excel,Vba,我正在尝试使用vba宏或python代码将xlsx文件转换为xls。到目前为止,我可以使用以下代码获得有关转换单个文件夹中文件的帮助: Sub ProcessFiles() Dim Filename, Pathname, saveFileName As String Dim wb As Workbook Dim initialDisplayAlerts As Boolean Pathname = "" Filename = Dir(Pathname & "*.xlsx") init

我正在尝试使用vba宏或python代码将xlsx文件转换为xls。到目前为止,我可以使用以下代码获得有关转换单个文件夹中文件的帮助:

Sub ProcessFiles()
Dim Filename, Pathname, saveFileName As String
Dim wb As Workbook
Dim initialDisplayAlerts As Boolean

Pathname = ""  
Filename = Dir(Pathname & "*.xlsx")
initialDisplayAlerts = Application.DisplayAlerts
Application.DisplayAlerts = False
Do While Filename <> ""
    Set wb = Workbooks.Open(Filename:=Pathname & Filename, _
                            UpdateLinks:=False)
    wb.CheckCompatibility = False
    saveFileName = Replace(Filename, ".xlsx", ".xls")

    wb.SaveAs Filename:=Pathname & saveFileName, _
              FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
              ReadOnlyRecommended:=False, CreateBackup:=False

    wb.Close SaveChanges:=False
    Filename = Dir()
Loop
Application.DisplayAlerts = initialDisplayAlerts
End Sub
子进程文件()
Dim文件名、路径名、将文件名另存为字符串
将wb设置为工作簿
Dim initialDisplayAlerts为布尔值
路径名=“”
Filename=Dir(路径名和“*.xlsx”)
initialDisplayAlerts=Application.DisplayAlerts
Application.DisplayAlerts=False
文件名“”时执行此操作
设置wb=Workbooks.Open(文件名:=路径名和文件名_
UpdateLink:=False)
wb.CheckCompatibility=False
saveFileName=Replace(文件名“.xlsx”、“.xls”)
wb.SaveAs文件名:=路径名和保存文件名_
文件格式:=xlExcel8,密码:=“”,WriteResPassword:=“”_
ReadOnlyRecommended:=False,CreateBackup:=False
wb.Close SaveChanges:=False
Filename=Dir()
环
Application.DisplayAlerts=初始显示警报
端接头
我现在试图将其推广到给定文件夹中的所有子文件夹

更重要的是,我正在尝试构建一个宏,它执行以下操作:

  • 在父文件夹为常量的批处理模式下运行此操作
  • 在后台处理代码,并将所有转换的文件放在各自的文件夹中
  • 例如,Max是我的主文件夹,其中可能有Med、Det、Vis、Liv子文件夹。在每个子文件夹中,将有数千个xlsx文件需要转换并放置在父文件存储的同一位置

    请帮忙

    谢谢,
    Maddy

    您可以在Python中这样做,如下所示。这将从单个文件夹中获取所有
    xlsx
    文件,并使用相同的名称以
    xls
    格式写入:

    import win32com.client as win32
    import glob
    import os
    
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    
    for excel_filename in glob.glob(r'c:\excel_files_folder\*.xlsx'):
        print excel_filename
        wb = excel.Workbooks.Open(excel_filename)
        wb.SaveAs(os.path.splitext(excel_filename)[0] + '.xls', FileFormat=56, ConflictResolution=2) 
    
    excel.Application.Quit()
    
    其中,
    56
    是要使用的格式编号,这些编号列在


    要在整个目录结构上执行此操作,可以使用
    os.walk
    ,如下所示:

    import win32com.client as win32
    import os
    
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    
    for dirpath, dirnames, filenames in os.walk(r'c:\excel_files_folder'):
        for filename in filenames:
            name, ext = os.path.splitext(filename)
            if ext == '.xlsx':
                wb = excel.Workbooks.Open(os.path.join(dirpath, filename))
                wb.DoNotPromptForConvert = True
                wb.CheckCompatibility = False
                excel.DisplayAlerts = False
                wb.SaveAs(os.path.join(dirpath, name + '.xls'), FileFormat=56, ConflictResolution=2) 
    
    excel.Application.Quit()
    

    请每个问题问一个具体问题。例如,“如何在excel vba中递归枚举xlsx文件”,“如何在excel vba中获取用户输入”。每个问题只要求一种编程语言。Hi Kay..按照建议进行了更改。谢谢Martin。这在某种程度上是可行的,但它会弹出兼容性检查器并等待我的回答。此外,如何运行问题中提到的子文件夹。您的代码似乎只有一条路径。您可以尝试添加
    ConflictResolution
    参数。我已更新以提供子文件夹解决方案。即使使用ConflictResolution参数,我正在获取每个文件的兼容性检查器弹出窗口。是否有任何方法可以抑制这些弹出窗口并顺利运行整个过程,而无需手动单击“继续”或“取消”以实现兼容性?请尝试添加
    wb.DoNotPromptForConvert=True
    抱歉,Martin,即使这样也无法抑制弹出窗口。