65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2010 年 5 月 26 日

CPOL

7分钟阅读

viewsIcon

211503

downloadIcon

1

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 应用程序中。

请参阅下图,我们将对此进行演示。

image002.png

先决条件

要开发这个简单的应用程序,您需要在开发环境中安装以下工具

  • 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 应用程序。

  1. 打开您的 Visual Studio 2010 IDE
  2. 选择“文件”>“新建项目”或直接按 CTRL + SHIFT + N 打开“新建项目”对话框
  3. 展开“Visual C#”节点,然后转到子节点“Silverlight”
  4. 在右侧窗格中选择“Silverlight 应用程序”
  5. 选择一个合适的目录来存储您的应用程序(例如,“D:\Sample Apps\”)。
  6. 现在为您的项目输入一个合适的名称(称之为:“Silverlight4.Interop.Excel.Demo”)。
  7. 从顶部的组合框中选择 .NET Framework 版本(我使用的是 .NET Framework 4.0)
  8. 单击“确定”继续
  9. 在下一个对话框中,确保选择了“在新的网站中承载 Silverlight 应用程序”选项
  10. 选择“Silverlight 4”作为 Silverlight 版本,然后点击“确定”

稍等片刻,Visual Studio 将为您创建一个 Silverlight 解决方案,其中包含一个 Silverlight 项目和一个用于托管您的 Silverlight 应用程序的 Web 应用程序项目。在您的 Silverlight 项目中,您会找到一个“MainPage.xaml”和一个“App.xaml”文件,这些文件已经由 IDE 模板为您创建好了。

项目设置完成后,您需要为 Silverlight 项目添加程序集引用。我们将使用“dynamic”关键字,为此我们需要添加“Microsoft.CSharp”程序集引用。

  1. 右键单击 Silverlight 项目中的“Reference”文件夹,然后从上下文菜单中选择“Add Reference”菜单项。

    image004.png

  2. 这将打开屏幕上的“Add Reference”对话框。滚动窗口以在 .NET 选项卡中找到名为“Microsoft.CSharp”的程序集。选择它,然后单击“OK”。这将把 Microsoft.CSharp 程序集引用添加到您的 Silverlight 项目中。添加后,您的项目将支持动态变量声明。

    image006.png

配置浏览器外设置

完成 Silverlight 项目的设置后,我们就可以为我们的应用程序实现自定义的浏览器外窗口了。您可以阅读 CodeProject 上关于创建 Silverlight 4 自定义浏览器外窗口的完整文章。

设计好浏览器外窗口后,转到 Silverlight 项目的属性。在 Silverlight 窗格中,确保您使用的是“Silverlight 4”作为目标版本。然后选择“Enable running application out of browser”,这将启用“Out-of-Browser Settings…”按钮。单击它以获取更多设置。

image008.png

在“Settings”对话框窗口中,选择“Show install menu”,这将会在 Silverlight 上下文菜单中创建一个菜单项。当您运行应用程序并右键单击应用程序时,您会在上面看到一个“Install”菜单项。我稍后会回到这一部分。

现在,勾选下面的“Require elevated trust when running outside the browser”选项,并将“Window Style”选择为“No Border”。这将使默认的 Chrome 窗口可见性折叠,并且当您在浏览器外运行 OOB 时,默认情况下您将看不到任何窗口边框。完成这些设置后,单击“ok”以保存配置。您还可以更改“Window Title”、“Size”和其他可用选项。

image010.png

浏览器外应用程序的基本设计

现在我们将设计我们的 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 的数据绑定,我们就可以在浏览器窗口中运行该应用程序了。加载了获取的数据后,我们的应用程序将如下图所示。

image012.png

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

image014.png

这将会在您的本地驱动器上安装该应用程序,并自动以浏览器外模式启动。在这里,您会看到一个略有不同的视图。您会注意到“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
}
image016.png

“导出到 Excel”事件实现

  1. 现在,让我们进行代码实现,将数据从 datagrid 导出到 Excel 应用程序实例。
    首先,我们将创建一个 Excel 应用程序实例,并将其可见性设置为 true,以便其他人可以看到它。
    excel = AutomationFactory.CreateObject("Excel.Application");
    excel.Visible = true;
  2. 现在,为打开的 Excel 应用程序实例创建一个工作簿。
    dynamic workbook = excel.workbooks;
    workbook.Add();
  3. 获取 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++;
    }
  4. 对于应用程序的第一个实例,我们将注册 SheetChange 事件通知到我们的应用程序。当您修改工作表内容时,此事件将触发。
    if (newInstance)
    {
        App.Current.MainWindow.Closing += (MainWindow_Closing);
        excel.SheetChange += new SheetChangedDelegate(SheetChangedEventHandler);
        newInstance = false;
    }
  5. 现在进入 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 工作表,并且数据正在逐行填充到工作表中。

image018.png

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

image020.png

现在开始编辑 Excel 工作表的任何一行。在我们的示例中,我们将使用第一列进行编辑,因为我们的代码只检查第一列。

// get the range of the items to update
dynamic col2range = sheet.Range("A1:A" + CustomerCollection.Count);
image022.png

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

image024.png

What Next?

我想您现在已经了解了通过 COM API 进行 Silverlight - Excel 消息传递的原理。这是一个新功能的简短演示。您现在可以对其进行修改,以更新更大范围的单元格,从而从 Excel 工作表更新 Silverlight datagrid 。请确保它仅适用于受信任的 Silverlight 浏览器外应用程序。

请为此文章投票,并让我知道您是否有任何反馈或建议,以便我为您改进它。

历史

  • 首次发布(2010 年 5 月 28 日)
© . All rights reserved.