4

我正在将Windows中的项目移植到 OSX。我已经克服了 OSX Word 2011 的 VBA不允许您将 POST 发送到服务器的问题,并且已经弄清楚如何从外部脚本返回字符串结果。现在我必须从使用我的外部脚本的返回构建的 URL 将图像插入到我的 Word 文件中。

当前尝试如下,在 Windows 中有效,但在 OSX 中使 Word 崩溃:

Selection.InlineShapes.AddPicture FileName:=File_Name, _
    LinkToFile:=False, SaveWithDocument:=True

在做了一些研究之后,看起来 MS 可能已将 OSX 中的此功能作为“安全风险”禁用。我仍然需要让它工作。有没有人知道 VBA for Office 2011 中的一种方法来完成这项工作,或者禁止这种解决方法?如果可能,我会尽量避免将图像文件写入磁盘。

更新:我创建了一个用于从 URL 获取图像文件的 Python 脚本,但我仍然不知道如何从 Python 脚本将此图像获取到 VBA,然后从那里获取到光标所在位置的 Word 文档。脚本的重要部分如下。图像作为PIL对象读入,我可以img.show()很好地显示它,但我不确定这是什么文件类型或如何让 VBA 接受它。

# Import the required libraries
from urllib2 import urlopen, URLError
from cStringIO import StringIO
from PIL import Image

# Send request to the server and receive response, with error handling!
try:
    # Read the response and print to a file
    result = StringIO(urlopen(args.webAddr + args.filename).read())
    img = Image.open(result)
    img.show()

except URLError, e:
    if hasattr(e, 'reason'):    # URL error case
        # a tuple containing error code and text error message
        print 'Error: Failed to reach a server.'
        print 'Reason: ', e.reason
    elif hasattr(e, 'code'):    # HTTP error case
        # HTTP error code, see section 10 of RFC 2616 for details
        print 'Error: The server could not fulfill the request.'
        print 'Error code: ', e.code

请注意,在上面,args.webAddrargs.filename使用argparse库传递给脚本。该脚本有效,并将显示我期望的图像文件。关于如何将该图像放入 Word 2011 for OSX 并将其插入光标下的任何想法?

非常感谢!

编辑:自迁移到 github 后更新了项目的链接。

4

1 回答 1

2

老问题,但没有答案,当图像位于 http URL 时,我在这里看到同样的崩溃。我认为您可以使用以下解决方法

Sub insertIncludePictureAndUnlink()
' Put your URL in here...
Const theImageURL As String = ""
Dim f As Word.Field
Dim r As Word.Range
Set f = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldIncludePicture, Text:=Chr(34) & theImageURL & Chr(34), PreserveFormatting:=False)
Set r = f.Result
f.Unlink
Set f = Nothing
' should have an inlineshape in r
Debug.Print r.InlineShapes.Count
' so now you can do whatever you need, e.g....
r.Copy
Set r = Nothing
End Sub
于 2013-10-25T20:31:15.880 回答