excel 2003使用的是复合文档文件格式。
excel 2007(含)开始微软引进了Open XML 文档格式,实际上是ZIP文件格式。
这两种文件格式都在文件头有特征的标识符。
比如复合文档文件格式的文件头部的开始有8个字节的特征标识符:0xD0CF11E0A1B11AE1。
ZIP文件格式的文件头部的开始有4个字节的特征标识符:0x504B0304。
根据以上的知识,可以使用如下的代码判断excel文件的文件格式:
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (lpofn As OPENFILENAME) As Long
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Function GOFN() As String
Dim sOFN As OPENFILENAME
With sOFN
.lStructSize = Len(sOFN)
'设置打开文件对话框中的文件筛选字符串对
.lpstrFilter = "Excel文件(*.xl*)" & Chr(0) & "*.xl*" & Chr(0) & "Word文件(*.do*)" _
& Chr(0) & "*.do*" & Chr(0) & "PPT文件(*.pp*)" & Chr(0) & "*.pp*" & Chr(0) & "所有文件(*.*)" & Chr(0) & "*.*" _
& Chr(0) & Chr(0)
'设置文件完整路径和文件名的缓冲区
.lpstrFile = Space(1024)
'设置文件完整路径和文件名的最大字符数,一定要比lpstrFile参数指定的字符数多1,用于存储结尾Null字符。
.nMaxFile = 1025
End With
i = GetOpenFileName(sOFN)
If i <> 0 Then
With sOFN
sFileName = Trim(.lpstrFile)
GOFN = Left(sFileName, Len(sFileName) - 1)
End With
Else
GOFN = ""
End If
Debug.Print GOFN, Len(GOFN)
End Function
Sub OpenFile()
sFilePath = GOFN
If Len(sFilePath) = 0 Then
End
Else
i = VBA.FreeFile
Open sFilePath For Binary Access Read As i
Dim arr(1 To 8) As Byte
Get i, 1, arr
Dim arrCDF(1 To 8) As Byte
arrCDF(1) = &HD0
arrCDF(2) = &HCF
arrCDF(3) = &H11
arrCDF(4) = &HE0
arrCDF(5) = &HA1
arrCDF(6) = &HB1
arrCDF(7) = &H1A
arrCDF(8) = &HE1
Dim arrZIP(1 To 4) As Byte
arrZIP(1) = &H50
arrZIP(2) = &H4B
arrZIP(3) = &H3
arrZIP(4) = &H4
j = VBA.InStrB(1, arr, arrCDF, vbBinaryCompare)
n = VBA.InStrB(1, arr, arrZIP, vbBinaryCompare)
If j > 0 Then
Debug.Print "选择的文件为复合文档格式"
End If
If n > 0 Then
Debug.Print "选择的文件为ZIP文档格式"
End If
Debug.Print j, n
End If
End Sub


发表评论