vbs-实现模拟打开excel和强制计算和保存
原因是excel里面包含了许多的计算公式,而且是跨sheet的,java代码不好处理
' Excel Batch Processor - Double-Click Compatible
' 使用脚本所在目录作为目标路径
targetFolder = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\") - 1)
' Check if running with WScript (GUI mode)
If InStr(1, WScript.FullName, "wscript.exe", vbTextCompare) > 0 Then
' Relaunch with CScript
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "cmd /c cscript.exe //nologo """ & WScript.ScriptFullName & """ & pause", 1, True
WScript.Quit
End If
Set fso = CreateObject("Scripting.FileSystemObject")
' Verify target folder exists
If Not fso.FolderExists(targetFolder) Then
WScript.Echo "ERROR: Target folder not found: " & targetFolder
WScript.Quit 1
End If
Set folder = fso.GetFolder(targetFolder)
' --- START PROCESSING ---
startTime = Timer
WScript.Echo "================================================================="
WScript.Echo " STARTING EXCEL FILE PROCESSING"
WScript.Echo " Directory: " & targetFolder
WScript.Echo " Start Time: " & Now()
WScript.Echo "================================================================="
On Error Resume Next
Set excel = CreateObject("Excel.Application")
If Err.Number <> 0 Then
WScript.Echo "ERROR: Excel not installed or access denied"
WScript.Quit 2
End If
excel.Visible = False
excel.DisplayAlerts = False
excel.AskToUpdateLinks = False
excel.EnableEvents = False
excel.Calculation = -4105 ' xlCalculationAutomatic
fileCount = 0
successCount = 0
errorCount = 0
skippedCount = 0 ' 新增跳过计数
' 获取Excel文件列表
Dim excelFiles
Set excelFiles = CreateObject("System.Collections.ArrayList")
For Each file In folder.Files
ext = LCase(fso.GetExtensionName(file.Path))
If ext = "xlsx" Or ext = "xlsm" Or ext = "xls" Then
fileCount = fileCount + 1
excelFiles.Add file.Path
End If
Next
If fileCount = 0 Then
WScript.Echo "No Excel files found in target directory"
excel.Quit
WScript.Quit 0
End If
WScript.Echo "Found " & fileCount & " Excel files to process"
WScript.Echo String(60, "-")
' Process files
current = 0
For Each filePath In excelFiles
current = current + 1
fileName = fso.GetFileName(filePath)
WScript.Echo "PROCESSING [" & current & "/" & fileCount & "]: " & fileName
' 跳过已打开的Excel文件
On Error Resume Next
Set workbook = excel.Workbooks.Open(filePath, 0, False)
If Err.Number = 0 Then
' 跳过只读文件
If workbook.ReadOnly Then
WScript.Echo " SKIPPED: File is read-only"
workbook.Close False
skippedCount = skippedCount + 1
Else
workbook.ForceFullCalculation = True
excel.CalculateFullRebuild
workbook.Save
workbook.Close False
successCount = successCount + 1
WScript.Echo " STATUS: SUCCESS"
End If
Set workbook = Nothing
Else
errorMsg = " ERROR: " & Err.Description
Select Case Err.Number
Case -2146827284: errorMsg = " ERROR: File not found or access denied"
Case 1004: errorMsg = " ERROR: File is already open or locked"
End Select
WScript.Echo errorMsg
errorCount = errorCount + 1
Err.Clear
End If
WScript.Echo String(60, "-")
Next
' Cleanup
excel.Quit
Set excel = Nothing
' --- END PROCESSING ---
endTime = Timer
processingTime = Round(endTime - startTime, 2)
WScript.Echo "================================================================="
WScript.Echo " PROCESSING COMPLETE"
WScript.Echo " Finish Time: " & Now()
WScript.Echo " Processing Duration: " & processingTime & " seconds"
WScript.Echo "-----------------------------------------------------------------"
WScript.Echo " Excel files found: " & fileCount
WScript.Echo " Successfully processed: " & successCount
WScript.Echo " Failed: " & errorCount
WScript.Echo " Skipped (read-only): " & skippedCount
WScript.Echo " Success Rate: " & Round((successCount/(fileCount - skippedCount))*100, 2) & "%" & _
" (excluding skipped)"
WScript.Echo "================================================================="
' ===== 新增:创建成功标记文件 =====
successFilePath = targetFolder & "\success.txt"
Set successFile = fso.CreateTextFile(successFilePath, True) ' True表示覆盖现有文件
successFile.WriteLine "Excel Batch Processing Completed Successfully"
successFile.WriteLine "Completion Time: " & Now()
successFile.WriteLine "Total Files Processed: " & fileCount
successFile.WriteLine "Success Count: " & successCount
successFile.WriteLine "Error Count: " & errorCount
successFile.WriteLine "Skipped Count: " & skippedCount
successFile.Close
Set successFile = Nothing
WScript.Echo "Success marker file created: " & successFilePath
WScript.Echo "Processing complete. Excel processes have exited."
WScript.Echo "Files are unlocked and ready for other applications."
WScript.Echo "Press any key to close this window..."
Set fso = Nothing
WScript.StdIn.Read(1)