您可以使用 VBA 从 Word 中的 OLE 对象获取图像数据吗?
Can you get image data from an OLE object in Word using VBA?
我正在使用一个脚本(不是我写的)将 Word 文档转换为 XML。只要 Word 文档的样式一致,一切都会完美无缺。脚本无法处理的事情之一是当图像作为 OLE 对象插入时。这些图像会被脚本简单地忽略,而作为非 OLE 对象定期插入的图像会被脚本很好地拾取。
我也一直在使用 VBA 脚本(请参阅下面的部分内容)在转换文档之前清理文档。该脚本向文档添加样式,移动一些东西,并且...我试图让它做的是将 OLE 图像转换为非 OLE 图像。
所以我想知道的是:有没有办法遍历文档中的 inlineShapes 并将 OLE 图形转换为常规图形,或者有没有办法从 OLE 对象中获取图像数据并粘贴它以 PNG 格式添加到文档中。
这就是 my vba 脚本现在所做的:
Sub docscrubber()
Dim i As Integer
Dim total As Integer
Dim oIshp As InlineShape
total = ActiveDocument.InlineShapes.Count
i = 0
For Each oIshp In ActiveDocument.InlineShapes
i = i + 1
On Error Resume Next
Application.StatusBar = "Progress: " & i & " of " & total
With oIshp
oIshp.Range.Copy
oIshp.Select
Selection.Paste
End With
Next oIshp
End Sub
我不是获取图像数据,而是获取文档代码。
提前致谢!
因为我不知道哪个 OLE 服务器链接到这些,甚至可能没有,所以我无法进行确定的测试,但是...
Word中的OLE对象,与任何动态信息一样,都是由域代码管理的。您可以使用 Alt+F9 打开和关闭域代码的显示。对于我测试的格式,这些是 EMBED 字段。
要将字段内容转换为静态内容(将 OLE 对象转换为它们的图形表示),取消链接字段就足够了。根据您向我们展示的代码,可能是这样的:
For Each oIshp In ActiveDocument.InlineShapes
i = i + 1
'On Error Resume Next ' do NOT use this!
Application.StatusBar = "Progress: " & i & " of " & total
With oIshp
If oIshp.Range.Fields.Count = 1 Then
oIshp.Range.Fields.Unlink
End If
End With
Next oIshp
我正在使用一个脚本(不是我写的)将 Word 文档转换为 XML。只要 Word 文档的样式一致,一切都会完美无缺。脚本无法处理的事情之一是当图像作为 OLE 对象插入时。这些图像会被脚本简单地忽略,而作为非 OLE 对象定期插入的图像会被脚本很好地拾取。
我也一直在使用 VBA 脚本(请参阅下面的部分内容)在转换文档之前清理文档。该脚本向文档添加样式,移动一些东西,并且...我试图让它做的是将 OLE 图像转换为非 OLE 图像。
所以我想知道的是:有没有办法遍历文档中的 inlineShapes 并将 OLE 图形转换为常规图形,或者有没有办法从 OLE 对象中获取图像数据并粘贴它以 PNG 格式添加到文档中。
这就是 my vba 脚本现在所做的:
Sub docscrubber()
Dim i As Integer
Dim total As Integer
Dim oIshp As InlineShape
total = ActiveDocument.InlineShapes.Count
i = 0
For Each oIshp In ActiveDocument.InlineShapes
i = i + 1
On Error Resume Next
Application.StatusBar = "Progress: " & i & " of " & total
With oIshp
oIshp.Range.Copy
oIshp.Select
Selection.Paste
End With
Next oIshp
End Sub
我不是获取图像数据,而是获取文档代码。
提前致谢!
因为我不知道哪个 OLE 服务器链接到这些,甚至可能没有,所以我无法进行确定的测试,但是...
Word中的OLE对象,与任何动态信息一样,都是由域代码管理的。您可以使用 Alt+F9 打开和关闭域代码的显示。对于我测试的格式,这些是 EMBED 字段。
要将字段内容转换为静态内容(将 OLE 对象转换为它们的图形表示),取消链接字段就足够了。根据您向我们展示的代码,可能是这样的:
For Each oIshp In ActiveDocument.InlineShapes
i = i + 1
'On Error Resume Next ' do NOT use this!
Application.StatusBar = "Progress: " & i & " of " & total
With oIshp
If oIshp.Range.Fields.Count = 1 Then
oIshp.Range.Fields.Unlink
End If
End With
Next oIshp