以编程方式更新嵌入式excel文件

Sch*_*els 4 embed excel word-2007 docx

我正在尝试以编程方式修改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>
Run Code Online (Sandbox Code Playgroud)

word文档使用OLEObject链接到嵌入的Excel文档.出于显示目的,使用.wmf文件(使用该v:shape元素).我修改了excel文档,这个文档已经过时了.

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

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

当然,我希望在打开文档时表格显示正确的表格.如何触发Word以丢弃图像并重绘预览?

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

Tod*_*ain 5

对此没有完美的解决方案,但大多数时间都有效的方法是强制打开/关闭OLEFormat.Object.如果从Word外部对嵌入式Excel工作表进行补液(即操作Open XML格式)或通过对象模型进行补充,则无关紧要.它涉及的是从Word中打开嵌入式Excel电子表格,然后关闭该对象,以便将图像更改为嵌入电子表格中的当前值和要创建的新图像.

如果您在许多Word文档或仅仅一个文档上执行此操作,它只需要一点点.在前一种情况下,一个全局模板(例如normal.dot或您创建并放入STARTUP文件夹的自定义模板)或稍后的情况下,只需运行一个文档后面的代码.两者都有不同的方式来运行,但基本上你将挂钩Document_Open事件,并从那里检查当前文档是否具有OLE嵌入对象,如果是,打开和关闭它们.

没有像我说的那样进入钩子,代码并不漂亮.基本上因为它使用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
Run Code Online (Sandbox Code Playgroud)

至少,您可以将此代码放在normal.dot中,并将其分配给QAT以作为宏运行.

请注意,代码不会绕过Excel打开,值会更改然后关闭 - 这是使用嵌入对象的一部分.使用链接代替嵌入将是一种更顺畅的方式来完成所有这些,但我意识到它并不总是一种选择.