VBS判斷excel版本

想要實現如下的兩個目標:

1.通過vbs判斷某路徑下的數個excel文件是03版本還是07版本,如果有文件是03的,跳出,如果都是07的則調用某批處理文件.

2.同上類似,不過是單個判斷,指定文件名的excel文件,判斷其版本,是03跳出,07的則調用批處理.

EXCEL2007的文件擴展名和2003不同。2003是XLS,2007是XLSX。即使是在EXCEL2007裏存爲XLS,那它也是2003的格式。所以這個不會有錯。所以先DIR”路徑\*.exl*”,然後循環dir,把所有EXCEL文件的名稱得到,在循環中賦給臨時變量,比如theforeverOncsdn。這個具體方法網上有很多現成的遍歷文件夾內文件的例程,很多是使用FSO的方法,大體也差不多,只要能實現都可以。
在得到每個文件名的時候,就可以截取擴展名判斷是XLS還是XLSX。前者則爲2003,後者則爲2007.

這個最通用的應該是自己解析PE文件格式,從中讀取到excel.exe的版本信息,當然也可以用一些取巧的方法來實現,例如:
VBScript code:
Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″)
WScript.Sleep 500
‘oInfo = Split(oVer.body.innerHTML,Chr(01))
‘For i = 1 To UBound(oInfo)
‘WScript.Echo oInfo(i)
‘Next
WScript.Echo oVer.body.innerhtml
其中就包含了excel的版本。
另外一個方法則是判斷excel.exe的創建時間來判斷版本,只需要用到fso對象即可。

但是上面的方法好像是不那麼對的,因爲“Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″) ”這個方法只是能取到本機安裝的EXCEL的版本,但不是具體每個EXCEL的版本,意義完全是兩碼事,如果安的是2007,不代表沒有2003的EXCEL文檔。

“另外一個方法則是判斷excel.exe的創建時間來判斷版本,只需要用到fso對象即可.”
這個根本是不行的。EXCEL.EXE的創建時間?這個根本說明不了什麼,文件每當被複制時都可能重新設置時間,這個取決於系統的設置,有的設置是保留原始創建時間的,但有的設置就不會保留而使用複製時的時間。

“最通用的應該是自己解析PE文件格式”。PE文件是指可執行文件,EXE和DLL這樣的。如果用HEX編輯器看XLS,會發覺有點像,但根本不是。不過排除這個認定錯誤,就說是用文件的文件頭信息的話,的確是最準確的,因爲擴展名也可以改(不過改了肯定會影響使用,所以正常來說不會故意改成不好使,只不過說有這種極端的可能性存在),而文件數據,其實也是可以改的,但改了就可能完全不能用了。

而且“Set oVer = WScript.GetObject(“res://C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE/16/1″) ”
而且這個方法如果只這樣寫,也可能完全失效。因爲安裝路徑不可能固定就是這樣,用戶會自己選擇驅動器和安裝目錄名稱。如果是取本機的EXCEL版本,取註冊表裏EXCEL註冊鍵的版本信息就可以。

另外,關於EXCEL文件格式,上面說了肯定不是PE,而且,當初對XLSX也稍微研究了一下,發現這個文件,可以改成ZIP擴展名使用,沒錯,它就是一個壓縮包(所以同樣內容,用EXCEL2007格式保存反而比EXCEL2003格式更小,這正是導致我這個發現的判斷線索)。裏面按組織存了若干文件,十分有趣,意義很明顯,而且都可以編輯,基本都是XML格式,只不過不是很直觀,如下的代碼就能完全實現這個目標,如下:

VBScript code:
Function getStdOut(exeCstr)
on error resume next
Set ws = CreateObject("WScript.Shell")
Set oStdOut = ws.Exec(exeCstr).StdOut
Do until oStdOut.AtEndOfStream
' getStdOut = getStdOut & oStdOut.Read(1)
' getStdOut = getStdOut & oStdOut.ReadLine()
getStdOut = oStdOut.ReadAll()
Loop
End Function

Function get7zType(ExePath7z, FileName)
if ExePath7z="" then : ExePath7z="D:\7z-920\7z.exe" : end if ' Note: "ExePath7z" must be a short path name
oType = getStdOut("cmd.exe /k " & ExePath7z & " l -slt """& FileName &""" | findstr /I ""^Type.=."" && exit")
get7zType =Right(oType, Len(oType)-6)
End Function
msgbox get7zType("" , wscript.arguments(0))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章