【问题标题】:convert xlsx files to xls inside folders and subfolders in Excel VBA or Python在 Excel VBA 或 Python 中将 xlsx 文件转换为文件夹和子文件夹中的 xls
【发布时间】:2016-01-28 12:22:04
【问题描述】:

我正在尝试使用 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

我现在正在尝试将其推广到给定文件夹中的所有子文件夹。

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

  1. 在父文件夹不变的批处理模式下运行。
  2. 在后台处理代码并将所有转换后的文件放在相应的文件夹中。

例如,Max 是我的主文件夹,里面可能有 Med ,Det,Vis,Liv 子文件夹。在每个子文件夹中,将有数千个 xlsx 文件需要转换并放置在同一位置父文件已存储。

请帮忙。

谢谢, 麦迪

【问题讨论】:

  • 请针对每个问题提出一个 具体问题。例如。 “如何在 excel-vba 中递归枚举 xlsx 文件”,“如何在 excel-vba 中获取用户输入”。每个问题只要求 一种 编程语言。
  • 嗨,凯..按建议更改。

标签: python excel vba


【解决方案1】:

您可以在 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 是要使用的格式编号,这些都列在Microsoft website 上。


要在整个目录结构上执行此操作,您可以使用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()

【讨论】:

  • 谢谢马丁。这在某种程度上有效,但它会弹出兼容性检查器并等待我的回复。此外,我如何让我的问题中提到的子文件夹运行。你的代码似乎需要只有一条路。
  • 您可以尝试添加ConflictResolution 参数。我已更新为您提供子文件夹解决方案。
  • 即使使用 ConflictResolution 参数,我也会弹出每个文件的兼容性检查器。有没有办法抑制这些弹出窗口并顺利运行整个过程,而无需手动单击“继续”还是为了兼容性而“取消”?
  • 尝试添加wb.DoNotPromptForConvert = True
  • 对不起马丁,即使这样也无法抑制弹出窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多