以编程方式更新嵌入的 Excel 文件

2023-12-01

我正在尝试以编程方式修改 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 文档,该文档使此预览过时。

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

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

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

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


对此没有完美的解决方案,但大多数情况下有效的解决方案是强制打开/关闭OLEFormat.Object。无论您是从 Word 外部重新水合嵌入的 Excel 工作表(即操作 Open XML 格式)还是通过对象模型执行此操作,都没有关系。它涉及到从 Word 中打开嵌入的 Excel 电子表格,然后关闭该对象,以便将图像更改为嵌入电子表格中的当前值并创建新图像。

这在一定程度上取决于您是在多个 Word 文档上执行此操作还是仅在一个 Word 文档上执行此操作。在前一种情况下,使用全局模板(例如 normal.dot 或您创建并放入 STARTUP 文件夹中的自定义模板),或者在后一种情况下,只需在一个文档后面运行代码。两者都有不同的方式让事情运行,但本质上你会挂接Document_Open事件并从那里检查当前文档是否有 OLE 嵌入对象,如果有,则打开和关闭它们。

正如我所说,如果不陷入困境,代码就不漂亮。基本上是因为它使用SendKeys。大多数时候,这会起作用。有些时候,它不会。这就是本质SendKeys以及未经同意而获得焦点的其他程序(例如即时通讯程序)。

If Word has the focus (which means you can't open the VBE and press F5), this code should do the trick:

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 打开、值更改然后关闭的问题 - 这是使用嵌入对象的重要组成部分。使用链接而不是嵌入将是完成所有这一切的更顺利的方法,但我意识到这并不总是一种选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式更新嵌入的 Excel 文件 的相关文章

  • 在 C++ GPGPU 库中嵌入 cg 着色器

    我正在编写一个 GPGPU 流体模拟 它使用 C OpenGL Cg 运行 目前 该库要求用户指定着色器的路径 然后从中读取它 我发现必须在我自己的项目和测试中指定这一点非常烦人 因此我希望将着色器内容与其余内容链接起来 理想情况下 我的
  • 粘贴数据后取消选择列

    这可能很简单 但我无法解决它 我可以使用以下命令释放复制数据的列Application CutCopyMode False但粘贴数据的列仍然保持选中状态 我尝试过ActiveSheet EnableSelection xlNone正如论坛之
  • ReDim 保留“下标超出范围”

    我正在尝试将数据从 2 个双精度数组移动到 2 个不同的双精度数组 我不确定大小是多少 因为我正在从第一个数组中随机抽取样本并将其放入第二个数组中 当我添加 ReDim Preserve 行时 出现下标超出范围错误 Function Cre
  • 从 Excel 将参数传递到 SQL Server 上的 MS Query 中的临时变量

    我已经使用 Microsoft 查询创建了参数查询 如上所述here https superuser com questions 197453 run an sql query with a parameter from excel 200
  • 保存 xml 文档会导致文件损坏

    我有一个关于如何将 xmldoc 保存为 word 文件的问题 我想打开 word 文件 使用 xmldocument 类对潜在的 xml 结构进行一些操作 然后将其重新保存回 word 文件 这就是我目前正在做的事情 using Word
  • 复制数据透视表格式

    我无法将数据透视表格式复制到新工作表 基本上我想做的是 someRange Copy someOtherRange pasteSpecial xlPasteValues someOtherRange pasteSpecial xlPaste
  • 使用 python-docx 在 docx 文件中查找所有“正常”样式且字体大小不是 11 的文本

    到目前为止我的实现 from docx api import Document import pandas as pd from docx shared import Pt texts sizes document Document new
  • 使用 VBA 将数据从 Excel 导出到现有 PowerPoint 幻灯片

    我正在编写一个小型 excel 插件来进行一些简单的数据分析 但不幸的是我不是 VBA 程序员 到目前为止我已经做了什么 从巨大的 Excel 工作簿中获取数据并执行计算 将结果写入预先格式化的 Excel 骨架 文件 我接下来想要做什么
  • vba Excel 中的多个查找请求(在查找中查找)

    我正在尝试执行一种嵌套查找请求 用例是我需要在一个工作表上查找组 如果找到 则从找到的行中的单独列中获取用户 ID 值 然后在另一张纸 然后它应该执行一系列操作 然后在第一张表中找到下一个出现的组 我的代码是 LookupGroup Spl
  • 为什么 MS Excel 在 Worksheet_Change Sub 过程中崩溃并关闭?

    当我在 Excel 工作表上运行 VBA 代码时 我遇到了 Excel 崩溃的问题 我正在尝试在工作表更改中添加以下公式 Private Sub Worksheet Change ByVal Target As Range Workshee
  • 当应用程序继续运行时,如何清理 .NET 中的 COM 引用?

    我正在开发一个 NET 程序 该程序启动 Excel 的新实例 执行一些工作 然后结束 但必须让 Excel 保持运行 稍后 当程序再次运行时 它将尝试挂钩到前一个实例 在这种情况下处理 COM 对象释放的最佳方法是什么 如果我第一次没有对
  • 使用 SpreadsheetLight 进行行计数

    我正在寻找一个类似于 DataTable Rows Count 的函数 它可以与 SLDocument 一起使用来找出有多少行中有数据 SpreadsheetLight 中有可用的东西吗 还有其他方法可以实现这一目标吗 Brendan SL
  • 如何从包含许多表的 Excel 工作表中解析数据帧(使用 Python,可能使用 Pandas)

    我正在处理布局糟糕的 Excel 工作表 我正在尝试解析这些工作表并将其写入数据库 每个工作表可以有多个表 尽管这些可能的表格的标题是已知的 但哪些表格将位于任何给定的工作表上 它们在工作表上的确切位置也不是已知的 表格不以一致的方式对齐
  • 如何保留每个单元格中合并单元格的值?

    我创建了一个包含合并单元格的工作表 但合并单元格的值仅存储在第一个单元格中 无论如何 为了在每个单元格中保持相同的值 我使用的公式需要它 谢谢 在 Excel 2003 中 此宏执行以下任务 Public Sub UnmergeAndFil
  • 是否有任何公式可用于将特定单元格复制指定次数?

    目前我正在处理一份数据 其中我有一个公司名称列表 例如 1 A 2 B 3 C 还有很多 需要的结果是 1 A 2 A 3 A 4 A 5 A 6 B 7 B 8 B 9 B 10 B 11 C 12 C 13 C 14 C 15 C 等等
  • Excel:包括过滤器中的第一行

    我正在特别考虑 Excel VBA 的 AutoFilter 方法 但我认为我的问题也适用于 GUI 当我将筛选器应用于 Excel 工作表时 未选择任何内容 筛选器将应用于所有行从第二次开始 有什么方法可以包含第一行 以便它也可以被过滤掉
  • 这个 if 语句中怎么有太多参数

    My IF下面的声明不断错误射击 指出参数太多 为什么是这样 谁能看出下面的语句有什么错误吗 IF G7 EUR H7 1 15 L7 IF G7 USD H7 1 35 L7 IF G7 AUD H7 1 35 L7 IF G7 CAD
  • 使用 OpenXML 读取列中的 Excel 工作表数据

    有没有一种方法可以使用 OpenXML SDK 和 C 按列而不是按行读取 Excel 工作表 我已经尝试使用 EPPlus 包 但遇到了一些问题 因为我的应用程序还使用 EPPlus 不支持的 xslm 文件 因此 我需要 OpenXML
  • 关闭工作簿时删除范围,xls vba

    我想要范围 Range A2 G z 关闭工作簿时删除 有人可以帮我处理代码吗 谢谢 凯 这就是我尝试过的 Option Explicit Sub Makro1 insert clipboard Workbooks Pfl SchutzSt
  • 根据其他列中的条件对列中的唯一值求和

    A B 1 Total 1 900 2 Product A 700 3 Product A 700 4 Product B 300

随机推荐