我有 MS-Word 和 Excel(如果有关系的话,还有 MS Office 2019)。我使用 Word 制作漂亮的标签纸,贴在日历上。标签是图像,而不是文本。页面包含 6 × 15 个标签。我以前会费力地将图像粘贴到每个标签上,但我已经厌倦了这样做。所以我改用 Word 的邮件合并功能。
现在每个标签都有一个字段(在快速部件使用术语字段的意义上),如下所示:
{ INCLUDEPICTURE { IF TRUE "{ MERGEFIELD Filename }" } \d}
Filename
然后,我使用 ODBC 连接到 Excel 文件,从邮件合并表中获取每个标签的值,并将其替换到INCLUDEPICTURE
字段中,以便相应的图像出现在标签上。这可能不太优雅,但效果很好。
Word 使用 ODBC SQL 语句从 Excel 获取文件名列表
SELECT * FROM `'Public Holidays$'`
而公共假期是 Excel 电子表格中一个选项卡的名称。
如果我想向邮件合并提供不同的文件名列表,我可以这样做
Mailings | Select Recipients | Use an existing list... | +Connect to a New Data Source.odc
| Open data source: OLE DB Database Files (OK)
| What kind of data source?: ODBC DSN (Next)
| Excel Files (Next) | Select the database: (path to Excel file),
☑ Connect to a specific table:
在表格列表中,我看到几个表单名称'Public Holidays$'
指向电子表格中同名的选项卡(没有尾随$
符号)。
接下来我在同一个电子表格中添加了一个新标签。
我原本以为新选项卡会出现在这个表格列表中(关闭 MS-Word 和 Excel 并重新启动后)。但事实并非如此。经过一上午的折腾,我发现有时会出现,有时不会。
最初与 Excel 电子表格的连接是由 MS-Word 向导设置的。我当时困惑不解,记不清这一切是如何运作的。我无法重现我所做的一切。
我想知道的是,Excel 电子表格中的选项卡(即 ODBC DSN 表)是如何出现在附加了 的 ODBC 表列表中$
的,为什么有时会发生这种情况,有时不会发生?我必须做什么特别的事情才能使新选项卡出现在列表中?我怀疑这与选项卡有关,因为我通过复制初始选项卡创建的选项卡出现在表列表中,但如果我只是插入一个新选项卡,该选项卡就不会出现在表列表中。无论如何,看起来是这样。
我已经发现,如果我在 Excel 电子表格中设置一个命名范围,该名称就会出现在表格列表中(没有$
附加内容),这样做可以解决实际问题。
但我想了解为什么有些 Excel 选项卡在列表中显示为表格并$
附加名称,而其他选项卡则没有。长期使用 Windows 的经验让我认为以 结尾的资源名称$
是神奇的。在这种情况下,神奇的是什么?
(根据我原来的帖子修改)
据我所知,该问题是由与您用于连接 Excel 数据源的特定路由相关的 Microsoft 错误引起的。
最简单的解决方法几乎肯定是直接在对话框中选择 .xls(或 .xlsx),
Select Data Source
而不是单击该对话框中的“新源...”按钮。这意味着如果 .xls 不在您的My Data Sources
文件夹中,您将需要找到它。如果您这样做,一旦您选择了 .xls/.xlsx,发生的情况取决于您是否选中了该
Word->File->Options->Advanced->General->Confirm file format conversion on open
选项。如果您没有选中它,Word 将尝试使用适当的 OLEDB 提供程序打开工作簿。OLEDB 提供程序已成为 Windows Word 的 Excel 文件默认提供程序超过 20 年,并且通常比任何 ODBC 选项都更容易使用。但是,您可能出于某些原因需要使用 ODBC 驱动程序(例如,两个提供程序/驱动程序对数字的格式不同),在这种情况下,您可以使用另一个连接程序
如果您已选中它,Word 将显示
Confirm Data Source
对话框。如果文件是 .xlsx 文件,您应该只看到一个选项,OLE DB Database Files
。选择它,Word 应该会显示工作表和命名范围的列表。如果文件是 .xls 文件,您可能会看到一个或多个 ODBC 选项以及一个 DDE 选项。但仍然选择 OLE DB 选项并从那里开始。本质上,至少有 3 种不同的路径可以通过 ODBC/OLEDB 进行连接。
OLEDB 路由仅使用适当的 OLEDB 提供程序,该提供程序有一个对话框,显示该提供程序“看到”的对象。
还有另一种类似的方法,只需使用适当的 ODBC 驱动程序即可。这种方法的对话框更令人困惑,因为 (a) 您可能必须再次重新选择文件名,或者对话框可能会选择错误的文件,并且 (b) 您必须单击其“选项...”按钮并选择“系统表”复选框以确保对话框显示它可以看到的所有对象。如果您确实需要继续使用 ODBC,我可以详细介绍这一点。
这些 OLEDB 和 ODBC 对话框显示彼此不同的列表,并且还可能根据工作簿是否在 Excel 中打开而显示不同的内容。(例如,如果工作簿在 Excel 中打开,则 ODBC 驱动程序会显示隐藏工作表的名称,但如果未打开,则不会显示)。
您一直使用的路由还做了另一件事 - 它使用 OLE DB Provider for ODBC Drivers 打开工作簿,并使用适用于 Excel 的适当 ODBC 驱动程序。此路由显示其自身可以查看的对象列表。但我认为存在错误,因为它似乎只能“查看”其中带有空格的工作表名称。(我怀疑它实际上是“导致驱动程序用单引号将名称括起来的工作表名称”)。因此,在一般情况下,这确实不是一个非常有用的路由。
如果有人想深入挖掘的话,下面这些细节可能会很有用。
我确实尝试查看 OLE DB 提供程序、普通 ODBC 驱动程序和 OLEDB 提供程序+ODBC 驱动程序究竟是如何识别 Excel 工作簿中的各种对象的。据我所知,OLE DB 提供程序将所有符合条件的对象视为类型为“TABLE”。符合条件的对象包括
相比之下,ODBC 驱动程序看到两种类型的东西:
据我所知,Microsoft 文档中关于 Excel ODBC 驱动程序的说法并非如此。它建议所有工作表的类型均为 SYSTEM TABLE,而范围的类型均为 TABLE。我怀疑文档是错误的。
当您处于“OLEDB+ODBC”对话框中时,列表显示表名称并省略系统表名称。
但是,当您在旧的 ODBC 对话框中并使用“选项”按钮选择所看到的内容时,仅选中 TABLE 选项时出现的唯一内容是在工作簿级别定义的范围名称(而不是定义为与工作表相关联)。如果您也选中 SYSTEM TABLES 选项,则其他所有内容都会出现。如果随后取消选中 TABLES 选项,整个列表就会消失。所以这并不能真正帮助我们理解该对话框如何决定它所看到的对象类型。所有这些对话框和列表都可能是由未直接与 ODBC 驱动程序通信的软件生成的,而找出发生了什么的唯一方法是编写一个 C/C++ 程序来直接调用 ODBC API。