> 技术文档 > vbs-实现模拟打开excel和强制计算和保存

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)