【问题标题】:How to *quickly* convert many .txt files into .xls files如何*快速*将许多 .txt 文件转换为 .xls 文件
【发布时间】:2020-07-08 14:24:39
【问题描述】:

更新:我刚刚发现有人拥有更强大的服务器来完成分配给我的任务,所以我没有让这个程序足够快也没关系。但是,下面的答案(自动化 Excel)帮助使程序快了三倍,所以我会推荐给文件较少(但仍然很多)的人。

我正在尝试将许多(超过 300,000 个).txt 文件转换为 .xls 文件。我在这里找到了如何做到这一点:

Batch Convert TXT to XLS Using VBA

但它真的很慢(在一个多小时内,它只转换了大约 300,000 个文件中的 200 个),即使文件不是那么大。

我尝试通过关闭 ScreenUpdating 来加速它,但我无法成功关闭 ScreenUpdating。有人可以解释在哪里关闭 ScreenUpdating 以便我的代码运行得更快吗?或者,更好的是,有任何关于更高效程序的想法吗?

代码如下:

Sub TXTconvertXLS()

'Variables
Dim wb As Workbook
Dim strFile As String
Dim strDir As String

 Application.ScreenUpdating = False
'Directories
strDir = 'path went here
strFile = Dir(strDir & "*.txt")

 Do While strFile <> ""

    Set wb = Workbooks.Open(strDir & strFile)
        With wb
            .SaveAs Replace(wb.FullName, ".txt", ".xls"), 50
            .Close False   '<-already saved in the line directly above
        End With
    Set wb = Nothing
    strFile = Dir   '<- stuffs the next filename into strFile
Loop
Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 恐怕ScreenUpdating=false打开的工作簿 无关。为了加快这个过程,我认为你应该使用其他语言来做到这一点,并隐藏 Excel。我相信大多数时候你的程序都忙于 GUI 的东西(打开工作簿并更新 Excel 本身的界面)。
  • 您实际上是在尝试仅重命名 300k 文件吗?
  • 将txt文件保存为xls文件的目的是什么?这对您更大的业务需求图景有什么价值?
  • 文件有多大,您将它们保存到哪里(本地驱动器或网络)?您是否尝试过计时哪个部分最慢?你真的有一个包含 30 万个文件的文件夹吗?
  • 这些文本文件是什么样的?如果它们是 csv 文件,也许只需将文件扩展名从 .txt 更改为 .cvs。安装 Office 时的标准 Windows 文件关联默认情况下会在 Excel 中打开此类文件。

标签: excel vba


【解决方案1】:

几个应该更快的选项。

  1. 使用Powershell(在记事本中将下面的代码保存为xx.ps1,更新您的源目录并运行)
  2. 在隐藏实例而不是当前实例中自动化 Excel。

Powershell

借鉴https://superuser.com/questions/875831/using-powershell-is-it-possible-to-convert-an-xlsx-file-to-xlsUsing Powershell to loop through Excel files and check if Spreadsheet name exists

$files = Get-ChildItem C:\Temp\*.txt
Write "Loading Files..."

$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $false
$Excel.DisplayAlerts = $false

ForEach ($file in $files)
{

     $WorkBook = $Excel.Workbooks.Open($file.Fullname)
     $NewFilepath = $file.Fullname -replace ".{4}$"
     $NewFilepath =  $NewFilepath + ".xls"
     $Workbook.SaveAs($NewFilepath,56)   

}
  Stop-Process -processname EXCEL
  $Excel.Quit()

自动化 Excel

Sub TXTconvertXLS2()

Dim objExcel As Excel.Application
Dim wb As Workbook
Dim strFile As String
Dim strDir As String

Set objExcel = New Excel.Application
With objExcel
    .Visible = False
    .DisplayAlerts = False
End With

    'Directories
    strDir = "c:\temp\"
    strFile = Dir(strDir & "*.txt")

    'Loop
     Do While strFile <> ""
        Set wb = objExcel.Workbooks.Open(strDir & strFile)
            With wb
                .SaveAs Replace(wb.FullName, ".txt", ".xls"), 50
                .Close False   '<-already saved in the line directly above
            End With
        Set wb = Nothing
        strFile = Dir   '<- stuffs the next filename into strFile
    Loop

objExcel.DisplayAlerts = False
objExcel.Quit
Set objExel = Nothing

End Sub

【讨论】:

  • “在隐藏实例中而不是在当前实例中操作 Excel”是什么意思?我只是要复制并粘贴“Automate Excel”的代码块来替换我当前的宏
  • 我尝试了“Automate Excel”宏,它使程序快了三倍!但是,这仍然太慢了,我刚刚发现有人拥有更强大的服务器来完成分配给我的任务,所以我没有让它足够快也没关系。
  • 如果要处理300,000个文本文件,你需要一个数据库,而不是一个中间的excel宏
  • @studiis 很好,它更快,但同意尼克的评论,即您需要一种新方法(如果可能)来获得所需的数量级。您是否尝试过 PowerShell 方法?
  • 数据库方法是“不平凡的”——我们不知道你的宏做了什么。但我们确实知道,通过转换为 excel 然后运行宏来处理 300,000 是使用了错误的工具来完成这项工作
【解决方案2】:

要从 CSV 转换为 XLSX,请使用 brettdj 示例的这个 powershell 变体:

#Set-ExecutionPolicy Unrestricted

$files = Get-ChildItem C:\test\*.csv
Write "Loading Files..."

$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $false
$Excel.DisplayAlerts = $false

ForEach ($file in $files)
{

     $WorkBook = $Excel.Workbooks.Open($file.Fullname)
     $NewFilepath = $file.Fullname -replace ".{4}$"
     $NewFilepath =  $NewFilepath + ".xlsx"
     $Workbook.SaveAs($NewFilepath,51)

}

$Excel.Quit()  
Stop-Process -processname EXCEL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多