我正在尝试以编程方式修改word文档中的嵌入式Excel表。为此,我修改了docx文件和嵌入式excel文件。
主要文件的重要部分如下:
<w:object w:dxaOrig="8406" w:dyaOrig="2056">
<v:shape id="_x0000_i1028" type="#_x0000_t75"
style="width:390.75pt;height:95.25pt" o:ole=""><v:imagedata r:id="rId14"
o:title=""/>
</v:shape>
<o:OLEObject Type="Embed" ProgID="Excel.Sheet.12" ShapeID="_x0000_i1028"
DrawAspect="Content" ObjectID="_1349794876" r:id="rId15"
UpdateMode="Always"/>
</w:object>
word文档使用OLEObject链接到嵌入的Excel文档。出于显示目的,
使用.wmf文件(使用v:shape
元素)。我修改了excel文档,这个文档已经过时了。
这导致文档中出现一些奇怪的行为:
当然,我希望在打开文档时表格显示正确的表格。如何触发Word以丢弃图像并重新绘制预览?
对我来说,理想的解决方案是通过修改docx的内容来触发预览的重新生成,但使用小脚本的解决方案也会有所帮助。
答案 0 :(得分:5)
没有完美的解决方案,但大部分时间都可以强制打开/关闭OLEFormat.Object
。如果从Word外部对嵌入式Excel工作表进行补液(即操作Open XML格式)或通过对象模型进行补充,则无关紧要。它涉及的是从Word中打开嵌入式Excel电子表格,然后关闭该对象,以便将图像更改为嵌入电子表格中的当前值和要创建的新图像。
如果您在许多Word文档或仅仅一个文档上执行此操作,这取决于一点。在前一种情况下,一个全局模板(例如normal.dot或您创建并放入STARTUP文件夹的自定义模板)或稍后的情况下,只需运行一个文档后面的代码。两者都有不同的方式来运行,但基本上你将挂钩Document_Open
事件并从那里检查当前文档是否有OLE Embedded对象,如果有,打开和关闭它们。
没有进入钩子,就像我说的那样,代码并不漂亮。基本上是因为它使用SendKeys
。大多数情况下,这将有效。有些时候,它不会。这是SendKeys
和未经同意接收焦点的其他程序(如即时通讯程序)的性质。
如果Word具有焦点(这意味着您无法打开VBE并按 F5 ),则此代码应该可以解决问题:
Sub UpdateEmbeddedXLSX()
Dim workbook As InlineShape
For Each workbook In ActiveDocument.InlineShapes
With workbook
If .Type = wdInlineShapeEmbeddedOLEObject Then
''# Excel.Sheet.12 for Excel 2007
If .OLEFormat.ClassType = "Excel.Sheet.12" Then
''# Open Object as spreadsheet
.OLEFormat.DoVerb wdOLEVerbPrimary
''# If you want, you can also do any updates here like
.OLEFormat.Object.ActiveSheet.Cells(2, 2).Value = ".1"
''# Nasty - but it works - SendKeys
SendKeys "{ESC}", True
End If
End If
End With
Next
End Sub
至少,您可以将此代码放在normal.dot中,并将其分配给QAT以作为宏运行。
请注意,代码不会绕过Excel打开,值会更改然后关闭 - 这是使用嵌入对象的一部分。使用链接代替嵌入将是一种更顺畅的方式来完成所有这些,但我意识到它并不总是一种选择。
答案 1 :(得分:1)
只是为了添加到一个旧帖子中,有人偶然发现了这个:
上面的代码效果很好,但我将其修改为使用书签而不是使用SendKeys。 SendKeys语句真的与键盘上的NumLock混淆了。只是该命令的一个怪癖。
我所做的是在我的Word文档模板中创建书签。然后在我的代码中,我创建了一个指向书签的指针:
Dim bMark as bookmark
Set bMark as ActiveDocument.Bookmarks("NameOfBookmark")
然后我代替SendKeys语句执行了以下操作:
bMark.Range.Select
Selection.EndKey
这基本上将焦点从嵌入式工作表中拉出,并移到页面的书签上。然后.EndKey语句只删除了选择。你甚至不需要它。
希望这有帮助!