首页 文章

Word VBA提取嵌入式文件的 Headers

提问于
浏览
2

我正在尝试提取Word docx中的所有嵌入式Excel文件 . 我知道我可以通过将docx的文件名更改为zip来快速完成此操作,然后在word / embeddings文件夹中找到所有Excel文件 .

问题是word / embeddings中的Excel文件具有非常通用的文件名(例如,Microsoft_Excel_Macro-Enabled_Worksheet1.xlsm,Microsoft_Excel_Macro-Enabled_Worksheet2.xlsm)而不是原始文件名 . 但是,原始文件实际上是csv而不是xlsm文件 .

我没有参与创建这个文档 . 我假设他们使用了Insert - > Object - > Create From File . 此外,我正在使用Word 2010,但根据兼容性检查器,该文档最初是使用Word 97-2003创建的,并且稍后使用Word 2007嵌入了这些文件 .

如果我进入docx,我可以找到原始文件名,右键单击嵌入式文件图标,然后转到宏启用工作表对象 - >转换... - >更改图标... - > Headers

但是,我不想手动为一堆嵌入的Excel文件执行此操作 .

那么有没有办法使用一些vba代码来提取所有嵌入文件的原始文件名列表?然后我可以使用此列表作为重命名通用命名文件的键 .

2 回答

  • 1

    使用 vba 我可以获取我的代码将所选文件的 Headers 打印到 immediate window (您可以在其他地方编写它) . 这是我的代码:

    Sub Caption_Ex()
    
         If Selection.Type = wdSelectionShape Then
             Selection.ShapeRange(1).ConvertToInlineShape.Select
         End If
    
         Debug.Print Selection.InlineShapes(1).OLEFormat.IconLabel
    
     End Sub
    

    这是@ user1964692为整个文档所做的事情,我将其包含在我的编辑中以供参考:

    Option Explicit
    
     Dim num As Integer
     Dim AD As Document
     Dim ctr As Integer
     Dim caption_names() as variant
     Dim numObjects As Integer
    
     Sub Extract()
    
     Set AD = ActiveDocument
    
     numObjects = AD.InlineShapes.Count
            ctr = 1
    
     For num = 1 To numObjects
         If AD.InlineShapes(num).Type = 1 Then
             'it's an embedded OLE type so open it.
             Redim Preserve caption_names(1 to ctr)
             caption_names(ctr) = AD.InlineShapes(num).OLEFormat.IconLabel
             ctr=ctr+1
         End If
     Next num
    
     End Sub
    

    这是我将通过脚本使用的解决方案:

    导航到 *.docx 所在的文件夹,然后在那里打开 cmd . 使用 *.zip 扩展名制作word文档的副本 .

    xcopy Doc1.docx *.zip

    然后使用7zipcmd 中提取文件 . 您应该将 7za.exe 与文档放在同一文件夹中 .

    7za.exe x Doc1.zip -o *.xml.rels -r

    xcopy document.xml.rels *.txt

    稍后您可以搜索其中包含 .xls 的行(假设您在C驱动器中,请相应地更改路径):

    powershell Command "select-string -path "C:\document.txt" -Pattern ".xls" | select line | out-file C:\lines.txt -append"

    您将在 lines.txt 文件中找到文件名,行号和整行,包括匹配(即 .xls ) . 这将为您提供您要查找的文件的名称 .

  • 1

    这是我最终做的事情:

    Sub Extract()
    
    Dim num As Integer
    Dim AD As Document
    Set AD = ActiveDocument
    
    Dim numObjects As Integer
    numObjects = AD.InlineShapes.Count
    
    Dim caption_names() as variant
    ctr = 1
    For num = 1 To numObjects
        If AD.InlineShapes(num).Type = 1 Then
            'it's an embedded OLE type so open it.
            Redim Preserve caption_names(1 to ctr)
            caption_names(ctr) = AD.InlineShapes(num).OLEFormat.IconLabel
            ctr=ctr+1
        End If
    Next num
    
    End Sub
    

相关问题