Excel实例下载
  VBA  应用教程
    数据库SQL知识
设为首页
从Excel中提取Flash的原理及VBA方法
作者:bengdeng | 来源:Excel吧 | 时间:2008-06-27 | 阅读权限:游客 | 会员币:0 | 【

很早前,本站介绍了怎么在Excel文件中插入Flash文件(http://www.excelba.com/showart.asp?art_id=122&cat_id=4),而今天要说的是,如何提取插入在Excel中的文件,这个方法也适合在其它Office文件中。

大家都知道要提取Excel中的图片,可以把Excel另存为网页文件,然后在相对应的文件夹中找到图片,而Flash文件不能用此方法来提取。

提取文件的方法为:

1、需要一款16进制编辑工具WinHex
2、打开含有Flash的Excel文档,点击“控件工具箱”的“设计模式”按钮进入设计模式,选择Excel中的Flash,复制粘贴到任意文件夹,会看到一个“片段”文件。
3、打开WinHex,将该“片段”文件拉到WinHex中,单击下拉菜单“搜索”→“查找16进制值”,搜索“465753”,在搜索到的“465753”中的“4”位置上单击右键,选择“选块开始”。
4、继续“搜索”→“查找16进制值”,搜索“3A5C”,然后按住F3,直到出现“3A5C未找到”,点击“是”,在最后搜索到的“3A5C”中“C”位置上单击右键,选择“选块结尾”。(注:少数情况可能会搜索不到“3A5C”,则改为搜索“3A”或“5C”,方法相同)。
5、在选块内任意处点击右键→编辑→复制选块→进入新文件→输入文件名 (如test.swf) →保存。

跟据上面的原理,就可以用VBA编程来解决,思想就是找到465753(Flash的文件头FWS),然后跟据随后的第4、5、6、7算出文件的长度,再提出其数据内容,写成swf文件。如果你对代码不感兴趣,只是要功能,也可以从Excel吧中http://www.excelba.com/showdown.asp?soft_id=108下载加载宏。


Sub ExtractFlash()
Dim tmpFileName As String, FileNumber As Integer, OldName As String
Dim myFileId As Long
Dim myArr() As Byte
Dim i As Long
Dim MyFileLen As Long, myIndex As Long
Dim swfFileLen As Long
Dim swfArr() As Byte
Dim Pd As Boolean
tmpFileName = Application.GetOpenFilename("office File(*.doc;*.xls),*.doc;*.xls", , "确定要分析的office文件 - http://www.excelba.com")
If tmpFileName = "False" Then Exit Sub
myFileId = FreeFile
Open tmpFileName For Binary As #myFileId
MyFileLen = LOF(myFileId)
ReDim myArr(MyFileLen - 1)
Get myFileId, , myArr()
Close myFileId
Application.ScreenUpdating = False
OldName = Left(tmpFileName, Len(tmpFileName) - 4)
i = 0
Do While i < MyFileLen
    If myArr(i) = &H46 Then
        If myArr(i + 1) = &H57 And myArr(i + 2) = &H53 Then
            Pd = False
            swfFileLen = CLng(&H1000000) * myArr(i + 7) + CLng(&H10000) * myArr(i + 6) + CLng(&H100) * myArr(i + 5) + myArr(i + 4)
            For myIndex = 0 To swfFileLen - 1
                swfArr(myIndex) = myArr(i + myIndex)
            Next myIndex
            myFileId = FreeFile
            tmpFileName = OldName & i & ".swf"
            Open tmpFileName For Binary As #myFileId
            Put #myFileId, , swfArr
            Close myFileId
            If Pd Then
            i = i + myIndex
            Else
            i = i + swfFileLen + 8
            End If
        Else
            i = i + 3
        End If
    Else
        i = i + 1
    End If
Loop
If Pd Then
    MsgBox "以" & OldName & "1-n.swf 名字保存", , "提示 - http://www.excelba.com"
Else
    MsgBox "选择的文件中不包含swf文件!", , "提示 - http://www.excelba.com"
End If
End Sub

不过上面的方法,对于压缩后的CWS格式的Flash文件,有可能不能正确导出,原因就是在此类文件插入到excel后,文件的长度有可能改变,我在具体实验时,当一个文件中在插入多个这样的Flash文件时,有可能导出的文件不能播放,不知道还有没有更好的方法。

文章录入:admin | 浏览次数:
相关评论(以下网友评论只代表其个人观点,不代表Excel吧的观点或立场)
相关信息

关于本站 | 留言本站 | 友情连接 | 后台管理
Copyright © 2005 - 2008 Excel吧 Inc. All Rights Reserved.
HxCms Ver9.0  闽ICP备06001689号
关闭此窗口