【问题标题】:How to save Word Shapes to image using VBA?如何使用 VBA 将文字形状保存到图像?
【发布时间】:2011-06-28 19:59:40
【问题描述】:

我有一个简单的要求,将 Word Doc 中嵌入的 MS-Office 绘图对象保存到图像文件中。以下代码适用于从 Powerpoint 中提取图像。但是,如果我将 ActivePresentation 修改为 ActiveDocument,则它不适用于 MS-Word。导出方法不适用于形状对象。有什么想法吗?

Dim oPPTShap as Shape
For k = 1 To .Slides(intSlide).Shapes.Count
    Set oPPTShape = ActivePresentation.Slides(intSlide).Shapes(k)
    oPPTShape.Export "C:\images\s" & k & ".bmp", ppShapeFormatBMP                
Next

【问题讨论】:

    标签: vba ms-word shapes


    【解决方案1】:

    这不是很好,因为它以 EMF 格式输出每个图像,但它确实将内联形状集合中的每个图像写入单个文件。当然可以修改它来收集其他形状。

    我想增强以直接写入JPG,但到目前为止还不知道VBA通过过滤器推送WRITE输出。因此,要使用这些文件,您需要运行一些外部后处理/批处理,以将文件从 EMF 转换为更可用的文件。

    Sub WriteInlineShapesToFile()
        Dim docCurrent As Document
        Dim shapeCurrent As InlineShape
        Dim RC As Integer
        Dim vData() As Byte
        Dim i As Long
        Dim lWritePos As Long
        Dim strOutFileName As String
    
        Set docCurrent = ActiveDocument
    
        i = 1
    
        For Each shapeCurrent In docCurrent.InlineShapes
            strOutFileName = "c:\temp\datafile" & CStr(i) & ".emf"
            Open strOutFileName For Binary Access Write As #1
            i = i + 1
            vData = shapeCurrent.Range.EnhMetaFileBits
            lWritePos = 1
    
            Put #1, lWritePos, vData
    
            Close #1
    
     Next shapeCurrent
    
        RC = MsgBox("Job complete.", vbOKOnly, "Job Status")
    
    End Sub
    

    【讨论】:

    • 谢谢。 Range.EnhMetaFileBits 也可以在 VSTO C# 中使用
    【解决方案2】:

    您试图从 PPT VBA 复制到 Word VBA 的代码将不起作用,因为 Word 中不存在该功能。

    你可以自己试试:当你在Word中选择形状并右键单击时,你没有另存为图像的功能......(而在PPT中你有这个功能)。

    然而,从this page,作者指出了一个 MVP,他构建了一个 VBA 解决方案来做你想做的事情:http://www.lebans.com/msword.htm

    希望它能做你想做的,

    【讨论】:

    • 您可以在 Word 中通过右键单击将图片保存到文件,但不能通过 VBA,因为 Word VBA 中的对象模型不包含 Export 函数.无论如何,您链接到的解决方案正是我所需要的,谢谢!
    【解决方案3】:

    这是我能想到的一个肮脏(也是最快的)技巧:D

    将word文档作为网页保存到临时文件夹。类似的东西

    ActiveDocument.SaveAs FileName:="C:\Temp\Sample.htm", FileFormat:=wdFormatHTML, _
    LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
    :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
    SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
    False
    

    word文档中的所有形状和图片都会自动保存在C:\Temp\Sample_Files文件夹中

    然后,您只需删除该文件夹中所有不是图像的文件 :)

    如果你想选择这个选项,请告诉我:)

    席德

    编辑

    天哪,我才意识到这是一个旧线程。嗯,感谢“Joel Coehoorn”编辑此线程 LOLZ

    【讨论】:

    • 知道为什么有些图像保存为 jpeg 而另一些保存为 gif 吗?如果只有“EnhMetaFileBits”属性,这些信息存储在哪里?
    【解决方案4】:

    好的,这不是解决方案,而是解决老问题的不同方法。到目前为止,我遇到了很多示例,它们要么将文件保存为 .HTML,然后从 HTML 文档的子文件夹中获取图像,要么提取文档存档然后从提取集中获取文件的代码。

    这个怎么样:

    1. 如果您在 Word 中,请遍历文档的内联形状。

    2. 对于每个内联形状:

      一个。将图像数据复制到剪贴板。您已经获得了其他元数据 通过 VBA 中的对象模型获得的图像。

      b.您可以像这样复制第一个内联形状的图像:

      ActiveDocument.InlineShapes(1).Range.CopyAsPicture
      

      c。现在图像数据在剪贴板中,应该可以得到 剪贴板中的数据。我知道 VBA 很糟糕,但你应该 能够使用 Windows API 来解决这个问题。如果您能以某种方式取回图像数据,则可以将其写入文件 您从对象模型中获得的元数据。

    【讨论】:

    • 这个答案没有答案。
    【解决方案5】:

    如果您将 Microsoft Powerpoint 添加到 Word VBA 参考并在 word 中定义一个 Powerpoint 应用程序对象,您也可以在 word 中编写一个 PowerPoint 宏。

    因此您可以利用 PP 导出功能:

    只需在word中选择形状,将其复制到剪贴板(selection.copy),然后将其粘贴到PP中的空白演示文稿中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2015-11-02
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多