发现 COM. Excel 实时数据源






3.80/5 (10投票s)
2002年5月21日
8分钟阅读

124326

3935
本文将演示如何使用 Visual Basic 创建和使用 COM 加载项。还提供了一个有用的示例。
引言
COM 加载项为开发人员提供了一种扩展 Office 2000 和 Office XP 应用程序功能以完成自定义任务的方法。COM 加载项通常用于在用户单击 CommandBar
按钮、窗体或对话框,或 Excel 的其他特定事件(如打开或关闭工作簿或在工作表上输入数据)时自动执行 Excel。
Microsoft Office 2000 及更高版本支持一种新的、统一的设计体系结构,用于构建应用程序加载项以增强和控制 Office 应用程序。这些加载项称为 COM 加载项。本文将演示如何使用 Visual Basic 创建 COM 加载项。
在 Microsoft Excel 2000 中,您无法直接从工作表单元格公式调用组件对象模型 (COM) 加载项中的函数。相反,您必须为 COM 加载项函数创建一个 Visual Basic for Applications (VBA) 包装器,以便可以间接调用该函数。Excel 2002 中 COM 加载项(称为自动化加载项)的集成已得到增强,使得现在可以直接从工作表公式调用 COM 加载项函数,而无需 VBA 包装器。
我们希望利用 Excel 的强大功能,在 Excel 单元格和图形中可视化一些表格中的历史和在线数据。这样,我们将能够在线计算大量列,添加计算,添加图形和计算字段,在线查看图形变化。使用 Excel,所有数据都将保存在您的工作簿中!
由于这些数据从 SQL 表传输到 Excel 客户端是通过 Internet 完成的,因此我选择 ISAPI 扩展 DLL 作为数据源的 HTTP 提供程序。实际上,Excel COM 加载项将以固定的时间间隔向 ISAPI 扩展 DLL 发出请求。ISAPI 将查询 SQL 数据库,格式化数据,并将其放入 HTTP 流中。Excel COM 加载项将接收这些格式化的数据,并用更新的值填充其单元格和图形!
优点
- 直接从服务器数据库获取数据到您的 Excel 工作表中。无需网页或下载文件!!!
- 这样,就可以在您的工作表中实现更多的计算、计算字段、基于主数据的图形。
- 可以轻松地将 ExcelFeed 客户端程序分发给您的客户。
- 使用 ISAPI,Web 服务器可以免除来自客户端的调用。
- 如果您希望获得与 IIS Web 服务器的最大并发连接数,或者提供海量 HTML 数据,ISAPI 扩展 DLL 是最佳选择。
功能
要启动客户端 ExcelFeed 应用程序,请运行安装程序 Setup.exe 并按照向导操作。成功安装后,打开 Excel 程序。您会在 Excel 中找到一个新的“Excel Real Feed”工具栏!
单击 Excel Real Feed 菜单的“RealFeed”按钮。将打开一个新的工作簿,并激活“登录”选项。单击 Excel Real Feed 菜单的“登录”按钮。
将出现“主切换板”对话框。从“国家/地区”组合框中选择一个国家/地区提供程序,输入用户名“andi”和密码“andi”,然后单击“登录”按钮。将激活“获取指数”和“获取股票”按钮。
单击 "GetIndices" 按钮后,将出现“IndicesHistory”对话框。Tickers 模块和功能与 indices 模块和功能相同。对话框的左侧是 History 模块。单击“GetIndicesHistory”后,工作表中将显示 IdIndex 的历史数据。还提供了一个历史图。
对话框的右侧是 Portfolio 模块。单击“GetIndicesPortfolio”后,工作表中将显示所有指数的在线数据。这里可以获得 3 种图形:饼图和日内图在同一个工作表中。本文顶部提供了一个示例图片。
历史日内图形在单独的工作表中为所有指数提供。如果我们在 IndicesHistory 或 TickersHistory 表单上选中“Lauch Real Feed”复选框,程序将在每 60 秒内观察 ISAPI 服务器的 GetOnlineIndices
方法 30 分钟。
https:///ArticleExcelFeed/IsapiExcelFeed.dll?GetOnlineIndices?
开发
COM 加载项是进程内 COM 服务器(ActiveX DLL),它必须实现 IDTExensibility2
接口。所有 COM 加载项都必须实现此接口的五个方法:OnConnection
、OnStartupComplete
、OnAddinsUpdate
、OnBeginShutDown
和 OnDisconnection
。
当 COM 加载项安装在用户系统上时,会为该加载项创建注册表项。除了常规的 COM 注册外,COM 加载项还会为运行它的每个 Office 应用程序进行注册。Excel 使用的 COM 加载项在以下注册表项中注册
HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\
此项包含已安装的每个 COM 加载项的一个子项。子项的名称是 COM 加载项的 ProgID
。COM 加载项的子项还包含描述 COM 加载项的友好名称、描述和加载行为的值。加载行为描述了加载项在 Excel 中的加载方式:在启动时加载,仅在下次启动时加载,按需加载,或不加载。
也可以通过 Excel 用户界面加载和卸载 COM 加载项。为此,请按照以下步骤操作
- 在 视图 菜单上,指向 工具栏,然后单击 自定义。
- 在 工具栏 对话框中,单击 高级 选项卡。在类别列表中,选择 工具。在命令列表中找到 COM 加载项,然后将该命令拖到您选择的菜单或
CommandBar
上。关闭 工具栏 对话框。 - 单击您添加的 COM 加载项 命令以显示 COM 加载项 对话框。该对话框列出了您系统上安装的所有 COM 加载项,并且当前加载的 COM 加载项已选中。
创建 COM 加载项的步骤
- 在 Visual Basic 6.0 中启动新的 AddIn 项目。
- 添加对 Microsoft Office 9.0 和 Microsoft Excel 9.0 对象库的引用。
- 在 项目资源管理器 中,打开 窗体 文件夹,然后从项目中删除
frmAddin
。 - 在 项目资源管理器 中,打开 设计器 文件夹,然后双击 Connect Addin Designer。
- 在设计器的 常规 选项卡上,将 应用程序 改为 Microsoft Excel,然后将 初始加载行为 改为 启动。
- 在 视图 菜单上,单击 代码。
- 用您的代码替换 Connect 代码模块中的所有代码(请参阅示例 VB 项目)。
- 在 文件 菜单上,单击 生成 MyAddIn.dll 来构建 COM 加载项。
构建 COM 加载项时,它将被注册以供 Microsoft Excel 使用。由于您为 初始加载行为 指定了 启动,因此当您启动 Microsoft Excel 时,COM 加载项会自动加载。
为了进行 HTTP 调用,我使用了一个 HTTP 检索组件,它具有进行异步调用的能力。这些是必要的,以免在程序等待 HTTP 响应时阻止用户。该组件的完整代码包含在内。在以下文章中还提供了关于如何使用该组件的说明:发现 WIN32. 在 ASP & VB 项目中使用同步/异步检索 HTTP 内容的方法。
Set myORetrieve = CreateObject("RetrievePage.RetrievePage.1")
Dim str As String
str = myORetrieve.RetrieveAsync(urlIndicesHistory)
' launch a thread who look every 1
'seconds at retrieveasync function
If str = "ok" Then
'until the HTTP request are completed
TimerIndexHistory.Interval = 1000
End If
'This are the timer function ("thread who are looking every
'second at HTTP component completion"):
Private Sub TimerIndex_Timer()
Dim str As String
Dim lRetrieveAsyncCompleted As Long
'until lRetrieveAsyncCompleted = 0 i will dont goway
Message.Caption = "Loading Data..."
lRetrieveAsyncCompleted = _
myORetrieve.RetrieveAsyncCompleted(urlIndicesPortfolio)
If lRetrieveAsyncCompleted = 1 Then
str = myORetrieve.RetrieveAsyncPage(urlIndicesPortfolio)
TimerIndex.Interval = 0
Message.Caption = ""
' do something now with HTTP data
ParsePortfolio (str)
End If
If lRetrieveAsyncCompleted = -1 Then
TimerIndex.Interval = 0
Message.Caption = "Wrong URL"
End If
End Sub
从速度、每秒请求数和并发连接数方面来看,ISAPI 扩展 DLL 是 HTTP 数据源的最佳选择。
在每次 HTTP 命中时,ISAPI 模块会使用 CodeProject 网站上的 CAdoDatabase
和 CAdoRecordset
类再次向 SQL 数据库发出请求:)。微小的修改是仅将数据库连接保留为公共变量。
在每个方法中,需要的记录集都会被打开和关闭。一种优化是使用 AdoRecordset
类的 GetString
方法,该方法直接返回格式化的数据文本。ISAPI 连接字符串位于 IsapiDemoFeed.cpp 文件中,在构造函数中
m_bstrConnectionString="Provider=SQLOLEDB;Data Source=andi;Initial
Catalog=ArticlesExcelFeed;
User ID=sa;Password=;";
有关如何使用 ISAPI 扩展 DLL 作为 HTTP 数据源提供程序的更多信息,请参阅 发现 ISAPI. 图形小程序的数据源提供程序。
SQL 数据库(ArticlesExcelFeed)很简单,只包含几个表和视图。可以使用具有相同结构的 Access MDB 文件。
如果我们在 IndicesHistory 或 TickersHistory 表单上单击 Lauch Real Feed 复选框,程序将每 60 秒观察 ISAPI 服务器的 GetOnlineIndices
方法 30 分钟。
https:///ArticleExcelFeed/IsapiExcelFeed.dll?GetOnlineIndices?
如果 tblOnlineIndices
或 tblOnlineTickers
中的数据在此时间间隔内发生更改,我们将在 IndicesPortfolio (TickersPortfolio) 工作表单元格和 IndicesCharts (TickersCharts) 图表中获得已更改的在线数据。
安装
- ISAPI 连接字符串位于 IsapiExcelFeed.cpp 文件中,在构造函数中
m_bstrConnectionString=_ "Provider=SQLOLEDB;Data Source=andi;" + _ "Initial Catalog=ArticlesExcelFeed;" + _ " User ID=sa;Password=;";
- 在您的网站下创建一个名为 ArticleExcelFeed 的文件夹,并将 IsapiExcelFeed.dll 复制到其中。
- 为 IsapiExcelFeed 目录 Web 应用程序授予 脚本和可执行文件 执行权限。这样,IIS Web 服务器将能够执行 IsapiExcelFeed.dll。
- 要在 SQL 服务器上安装数据库,请在 SQL Server Enterprise Manager 中选择恢复数据库选项,然后选择 DB/ArticlesExcelFeed.bak 文件备份。数据库名称是 ArticlesExcelFeed。
- 为了在客户端计算机上使用 Excel COM 加载项,我们需要
RetrievePage
组件。在客户端计算机上,从 DOS 提示符使用regsvr32 RetrievePage.dll
命令。 - 要在客户端计算机上安装 Excel COM 加载项,请使用 文件->生成 ComExcelFeed.dll... 选项编译 VB 项目,然后启动 Excel 程序。也可以直接从 DOS 提示符使用
regsvr32 ComExcelFeed.dll
命令。您的 Excel 程序中将创建一个名为“ ”的新工具栏。 - 可以实现一个安装程序,该程序可以自动在所需计算机上安装 Excel 客户端。
演示应用程序
要安装演示应用程序,只需运行 ExcelFeedDemo setup.exe 程序并启动 Excel。(使用 andi/andi 作为用户名/密码)。