Word VBA提取嵌入式文件的标题

时间:2017-03-30 17:29:43

标签: excel vba excel-vba ms-word word-vba

我试图提取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 - >对象 - >从文件创建。此外,我使用的是Word 2010,但根据兼容性检查程序,该文档最初是使用Word 97-2003创建的,稍后将使用Word 2007嵌入这些文件。

如果我进入docx,我可以找到原始文件名,右键单击嵌入的文件图标,然后转到Macro-Enabled Worksheet Object - >转换... - >更改图标... - >字幕

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

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

2 个答案:

答案 0 :(得分:1)

使用vba我可以获取我的代码,将所选文件的标题打印到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"

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

答案 1 :(得分: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