VBS判断excel版本

这篇博客探讨了如何使用VBS判断Excel文件是2003还是2007版本。通过检查文件扩展名、解析PE文件格式、尝试获取Excel.exe版本信息以及利用7-Zip识别文件类型等方法,作者讨论了各种方法的可行性及其局限性。重点指出,最可靠的方法是检查文件头信息,因为扩展名可能被修改,而文件头信息不易篡改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要实现如下的两个目标:

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值