Silverlight 4:使用 COM 对象与 Excel 进行互操作





5.00/5 (19投票s)
Silverlight 4 具有通过 COM API 与 Excel 或任何其他应用程序通信的功能。在本文中,我将逐步指导您理解此功能。
目录
引言
Silverlight 4 能够通过 COM API 访问 COM 对象。您可以使用 Silverlight 中的这些 API 访问 PC 上安装的任何程序。您可以从 Silverlight 应用程序打开记事本、Word、Excel 或 Outlook。在这里,我将通过一个分步教程演示如何打开 Microsoft Excel 工作簿,然后演示 Silverlight 应用程序与 Excel 工作表之间的数据共享。在这里,我们将使用一个 DataGrid
来加载一些客户信息。然后,我们将数据传递到 Excel 工作表,然后修改外部应用程序(即 Excel 工作表内)中的数据。您会发现修改后的数据会自动反映到 Silverlight 应用程序中。
请参阅下图,我们将对此进行演示。

先决条件
要开发这个简单的应用程序,您需要在开发环境中安装以下工具
- Microsoft Visual Studio 2010
- 适用于 Visual Studio 2010 的 Silverlight 4 工具
请记住,Silverlight 4 应用程序只能在 Visual Studio 2010 中开发。因此,如果您在 PC 上安装了 Visual Studio 2008,您可以并排安装 Visual Studio 2010 来探索 Silverlight 4。
入门
如果您的开发环境已准备就绪,那么我们可以继续创建一个新的 Silverlight 应用程序项目。在本文档的最后,我们将能够在浏览器内运行我们的第一个 Silverlight 应用程序。
- 打开您的 Visual Studio 2010 IDE
- 选择“文件”>“新建项目”或直接按 CTRL + SHIFT + N 打开“新建项目”对话框
- 展开“Visual C#”节点,然后转到子节点“Silverlight”
- 在右侧窗格中选择“Silverlight 应用程序”
- 选择一个合适的目录来存储您的应用程序(例如,“D:\Sample Apps\”)。
- 现在为您的项目输入一个合适的名称(称之为:“Silverlight4.Interop.Excel.Demo”)。
- 从顶部的组合框中选择 .NET Framework 版本(我使用的是 .NET Framework 4.0)
- 单击“确定”继续
- 在下一个对话框中,确保选择了“在新的网站中承载 Silverlight 应用程序”选项
- 选择“Silverlight 4”作为 Silverlight 版本,然后点击“确定”
稍等片刻,Visual Studio 将为您创建一个 Silverlight 解决方案,其中包含一个 Silverlight 项目和一个用于托管您的 Silverlight 应用程序的 Web 应用程序项目。在您的 Silverlight 项目中,您会找到一个“MainPage.xaml”和一个“App.xaml”文件,这些文件已经由 IDE 模板为您创建好了。
项目设置完成后,您需要为 Silverlight 项目添加程序集引用。我们将使用“dynamic
”关键字,为此我们需要添加“Microsoft.CSharp
”程序集引用。
- 右键单击 Silverlight 项目中的“Reference”文件夹,然后从上下文菜单中选择“Add Reference”菜单项。
- 这将打开屏幕上的“Add Reference”对话框。滚动窗口以在 .NET 选项卡中找到名为“
Microsoft.CSharp
”的程序集。选择它,然后单击“OK”。这将把Microsoft.CSharp
程序集引用添加到您的 Silverlight 项目中。添加后,您的项目将支持动态变量声明。
配置浏览器外设置
完成 Silverlight 项目的设置后,我们就可以为我们的应用程序实现自定义的浏览器外窗口了。您可以阅读 CodeProject 上关于创建 Silverlight 4 自定义浏览器外窗口的完整文章。
设计好浏览器外窗口后,转到 Silverlight 项目的属性。在 Silverlight 窗格中,确保您使用的是“Silverlight 4”作为目标版本。然后选择“Enable running application out of browser”,这将启用“Out-of-Browser Settings…”按钮。单击它以获取更多设置。

在“Settings”对话框窗口中,选择“Show install menu”,这将会在 Silverlight 上下文菜单中创建一个菜单项。当您运行应用程序并右键单击应用程序时,您会在上面看到一个“Install”菜单项。我稍后会回到这一部分。
现在,勾选下面的“Require elevated trust when running outside the browser”选项,并将“Window Style”选择为“No Border”。这将使默认的 Chrome 窗口可见性折叠,并且当您在浏览器外运行 OOB 时,默认情况下您将看不到任何窗口边框。完成这些设置后,单击“ok”以保存配置。您还可以更改“Window Title”、“Size”和其他可用选项。

浏览器外应用程序的基本设计
现在我们将设计我们的 MainPage.xaml 文件,其中包含一个 DataGrid
,它将从 DataProvider
获取客户详细信息并为其生成列。我们将把 DataGrid
设置为只读,以便我们无法直接编辑其中的数据。
<sdk:DataGrid AutoGenerateColumns="True"
Height="295"
IsReadOnly="True"
HorizontalAlignment="Left"
VerticalScrollBarVisibility="Auto"
Margin="0,30,0,0"
x:Name="customerDataGrid"
VerticalAlignment="Top"
Width="576"
ItemsSource="{Binding CustomerCollection,
ElementName=userControl, Mode=TwoWay}" />
我们还将设置两个不同的按钮。一个用于将应用程序安装到浏览器外窗口,另一个用于将 datagrid
内容导出到 Excel 应用程序。以下是按钮的 XAML 代码。
<Button Height="28"
HorizontalAlignment="Left" Click="exportToExcelButton_Click"
Margin="244,333,0,0"
x:Name="exportToExcelButton"
Content="Export To Excel"
VerticalAlignment="Top"
Width="109" />
<Button Height="28"
HorizontalAlignment="Left" Click="installButton_Click"
Margin="244,333,0,0"
x:Name="installButton"
Content="Install"
VerticalAlignment="Top"
Width="109" />
您的设计准备就绪,并且您已经通过从 CustomerDataProvider
获取客户信息完成了与 datagrid
的数据绑定,我们就可以在浏览器窗口中运行该应用程序了。加载了获取的数据后,我们的应用程序将如下图所示。

在这里,您会注意到 DataGrid
底部的“Install”按钮已启用。单击该按钮可将此应用程序安装到浏览器外,作为独立应用程序,这样您就可以从桌面或开始菜单启动它。当您开始安装过程时,会弹出“Security Warning”对话框。单击“Install”继续。

这将会在您的本地驱动器上安装该应用程序,并自动以浏览器外模式启动。在这里,您会看到一个略有不同的视图。您会注意到“Install”按钮已不再可用,并且一个新的名为“Export to Excel”的按钮已添加到视图中。
以下代码块负责更改应用程序在不同视图中的外观。
if (App.Current.InstallState == InstallState.Installed)
{
if (App.Current.IsRunningOutOfBrowser)
{
// write the code for out-of-browser window to make the
// export to excel button visible
}
else
{
// write the code for the browser window to disable the install button
// when the application is already installed
}
}
else
{
// write the code for the default view
}

“导出到 Excel”事件实现
- 现在,让我们进行代码实现,将数据从
datagrid
导出到 Excel 应用程序实例。
首先,我们将创建一个 Excel 应用程序实例,并将其可见性设置为 true,以便其他人可以看到它。excel = AutomationFactory.CreateObject("Excel.Application"); excel.Visible = true;
- 现在,为打开的 Excel 应用程序实例创建一个工作簿。
dynamic workbook = excel.workbooks; workbook.Add();
- 获取 Excel 工作簿的 ActiveSheet,然后遍历
datagrid
集合的每一行和每一列,并将值设置到 Excel 工作表中。dynamic sheet = excel.ActiveSheet; dynamic cell = null; int i = 1; // iterate through the data source and populate the excel sheet foreach (Customer item in customerDataGrid.ItemsSource) { cell = sheet.Cells[i, 1]; cell.Value = item.Name; cell.ColumnWidth = 50; cell = sheet.Cells[i, 2]; cell.Value = item.ID; cell = sheet.Cells[i, 3]; cell.Value = item.Age; i++; }
- 对于应用程序的第一个实例,我们将注册
SheetChange
事件通知到我们的应用程序。当您修改工作表内容时,此事件将触发。if (newInstance) { App.Current.MainWindow.Closing += (MainWindow_Closing); excel.SheetChange += new SheetChangedDelegate(SheetChangedEventHandler); newInstance = false; }
- 现在进入
SheetChange
事件实现。在这里,我们将获取excelSheet
,我们首先将其存储为局部实例以供进一步访问。然后获取 Excel 应用程序中需要更新到我们应用程序的项的范围,并遍历这些项进行更新。以下是事件实现的 कोड。private void SheetChangedEventHandler(dynamic excelSheet, dynamic rangeArgs) { // copy the excelsheet to a local instance for further processing dynamic sheet = excelSheet; // get the range of the items to update dynamic col2range = sheet.Range("A1:A" + CustomerCollection.Count); for (int i = 0; i < CustomerCollection.Count; i++) { // update each and every row of the datagrid with the updated column // the first column in our case CustomerCollection[i].Name = col2range.Item(i + 1).Value.ToString(); } }
“导出到 Excel”演示
我们已经完成了代码编写。现在是演示的时候了。我们将看到我们的应用程序实际与 Microsoft Excel 应用程序进行通信。从我们的应用程序,我们将 datagrid
内容传输到 Excel 工作表。因此,请单击您的浏览器外应用程序中的“Export to Excel”按钮。您会注意到已创建了一个 Excel 工作表,并且数据正在逐行填充到工作表中。

让我们将我们的应用程序拖到 Excel 工作簿的上方,以进行实时演示。您现在可以看到 Silverlight 应用程序位于 Excel 之上,同时正在编辑工作表。

现在开始编辑 Excel 工作表的任何一行。在我们的示例中,我们将使用第一列进行编辑,因为我们的代码只检查第一列。
// get the range of the items to update
dynamic col2range = sheet.Range("A1:A" + CustomerCollection.Count);

一旦您完成了 Excel 工作表单元格的修改,只需按 Enter 键,它就会退出编辑模式。嘿,发生了什么?您注意到我们的应用程序有什么变化吗?是的,在我们的应用程序中,相应的单元格已使用修改后的单元格内容进行了更新。

What Next?
我想您现在已经了解了通过 COM API 进行 Silverlight - Excel 消息传递的原理。这是一个新功能的简短演示。您现在可以对其进行修改,以更新更大范围的单元格,从而从 Excel 工作表更新 Silverlight datagrid
。请确保它仅适用于受信任的 Silverlight 浏览器外应用程序。
请为此文章投票,并让我知道您是否有任何反馈或建议,以便我为您改进它。
历史
- 首次发布(2010 年 5 月 28 日)