以编程方式更新embedded的Excel文件

我正在尝试以编程方式修改Word文档中的embedded式Excel表格。 为此,我已经修改了docx文件和embedded式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链接到embedded的Excel文档。 为了显示,使用.wmf文件(使用v:shape元素)。 我修改了过时的预览的Excel文件。

这会导致文档中出现一些奇怪的行为:

  • embedded式(excel)表的预览显示错误的数据
  • 双击embedded式表格,在embedded式Excel中打开表格并显示正确的数据
  • closuresembedded式编辑器会触发生成新的预览,显示正确的数据

当然,我想让表格在文档打开时显示正确的表格。 如何触发Word放弃图像并重新预览?

对我来说,一个理想的解决scheme就是通过修改docx的内容来触发预览的重新生成,但是使用小脚本的解决scheme也会有所帮助。

对此没有完美的解决scheme,但大多数情况下工作的是强制打开/closuresOLEFormat.Object 。 不要紧,如果你是从Word以外(即操纵Open XML格式)或者通过对象模型来重新embeddedembedded式Excel工作表。 它涉及的是从Word中打开embedded的Excel电子表格,然后closures该对象,以便将图像更改为embedded电子表格中的当前值以及要创build的新图像。

如果你在很多Word文档或者只是一个文档上执行这个操作,这取决于一点点。 在前一种情况下,可以使用全局模板(例如normal.dot或您创build并放在STARTUP文件夹中的自定义模板),或者在后面的情况下,只需在一个文档后面运行代码。 两者都有不同的方法让事情运行,但基本上你会钩住Document_Open事件,并从那里检查当前文档是否有OLEembedded对象,如果是,打开和closures它们。

没有进入钩子,就像我说的那样,代码并不漂亮。 基本上,因为它使用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 

至less,你可以把这个代码放在你的normal.dot中,并把它分配给QAT来作为一个macros来运行。

请注意,代码不会绕过Excel打开,值会更改,然后closures – 这是使用embedded对象的一部分。 使用链接而不是embedded将是一个更平滑的方式来做到这一切,但我意识到这并不总是一个选项。

只要添加到一个旧的post,如果有人像我一样绊倒这个:

上面的代码很好,但我修改它使用书签,而不是使用SendKeys。 SendKeys语句真的与我的键盘上的NumLock混淆。 只是这个命令的怪癖之一。

我所做的是在我的Word文档模板中创build书签。 然后在我的代码中,我创build了一个指向书签的指针:

 Dim bMark as bookmark Set bMark as ActiveDocument.Bookmarks("NameOfBookmark") 

然后代替SendKeys语句,我做了以下操作:

 bMark.Range.Select Selection.EndKey 

这基本上把焦点从embedded式工作表中移出,并放到页面的书签上。 然后.EndKey语句只是删除select。 你甚至不需要它。

希望这可以帮助!