欢迎光临 C++Builder 研究! 本站主要面向软件开发者(Developer/Programmer), 提供 C++Builder, Delphi, C/C++, VC++ 等相关的资料。发布信息请致信给
编程文档
本站首页 www.ccrun.com | 编程文档 |   关键字:

用BDS 2006来开发基于Interop的Office程序

关键字:BDS2006,Interop,Office,Excel

作者:TR@SOE    更新:2008-09-03 15:49:53    浏览:17214

    Borland公司从Delphi 8开始支持.NET的编程,也就为我们打开了用Delphi+Interop来编写Office程序的大门。

    笔者曾就用BCB 6/Delphi 7进行Office开发写过若干文章,目前都放置在本站点,可以用相关TAG进行搜索(连接在此)。在这几篇早期的文章中,我也明确表示我会将开发的方向转移到利用Interop来开发Office上,那么接下来的一些时间我将兑现我的承诺,我将用BDS 2006来开发基于Interop的Office程序。

    关于Interop的概念,我这里不再展开,有兴趣的读者可以自行参阅Microsoft的说明文档。在当前,我们只要知道它是我们可以用来在Dephi中开发.NET的Office程序的Assembly就可以了。

    一、准备工作

    一般而言,我们都会先安装Windows XP,然后安装Office,然后安装BDS。但是这样的安装将无法提供Office的PIA(Primary Interop Assembly),因此我们需要重新启动Office的安装程序,增加Office组件。

    在增加Office的组件时,一定要选择自定义安装,同时在接下来弹出的对话框中要选中“选择应用的高级定制”(大意如此),于是Office安装程序就会弹出有关Office各个组件的更详细的选项列表,从中我们展开任何一个Office基本组件的话,都可以看到类似如下的“.NET 可编程性支持”选项:

.NET支持

    这就是我们要与之大打交道的Office PIA。Office PIA安装在Windows安装目录之下的Assembly目录中,在资源管理器中浏览起来大概是这样的:

Assembly

    我们可以清楚的看到Microsoft名下已经有了类似Microsoft.Office.Interop.Excel这样的PIA。

     二、在BDS 2006中引用PIA

    让我们启动BDS 2006(当然也可以只启动Delphi for .NET),并选择File|New,继续选择VCL Forms Application - Delphi for .NET。

BDS New Project

    BDS会创建一个空白的窗体,一个空白的单元文件。在继续下一步之前,先保存这个工程。选择菜单中的View|Project Manager观察工程管理窗口,并在References结点处右击并选择Add Reference,在弹出的对话框中切换到COM Imports页,滚动到Microsoft Excel 11.0 Object Library处:

Add Reference

    选择Add Reference并继续选择OK关闭对话框。在References结点下就会出现如下的新的引用:

New Reference

    参照上面的过程,继续添加对Microsoft Visual Basic for Aplication Extensibility和OLE Automation (2.0)的引用。编译这个工程,应该是没有错误了。

    我们来看看如何简单的启动Excel应用并退出Excel应用。打开单元文件,在头部的uses段落加入Microsoft.Office.Interop.Excel。随意在窗体上放置一个按钮,并书写它的事件处理函数如下:

procedure TForm1.Button1Click(Sender: TObject);
var e: Microsoft.Office.Interop.Excel.ApplicationClass;
begin
e:=Microsoft.Office.Interop.Excel.ApplicationClass.Create;
e.Visible:=true;
e.Caption:='在BDS 2006中调用Excel';
end;

    编译运行,Excel可以成功的被调用并显示:

Excel

    当然,现在的Excel应用中没有任何实质性的东西。而这个DEMO也只是先展示一下框架而已。

    如果我们终止程序的运行,可以看到Excel也会结束运行,如果此时我们打开任务管理器并观察进程列表,可以发现并没有Excel进程。这说明Excel进程“完整”的退出了。

    如果我们再次回到我们保存工程的目录,可以看到除了常规的pas、nfm、bdsproj、exe、res文件之外,又多了三个dcpil文件,它们分别是Microsoft.Office.Interop.Excel.dcpil,Microsoft.Vbe.Interop.dcpil和stdole.dcpil,分别对应了我们在工程中引用的三个COM类型库。

    在BDS中,不仅有Delphi .NET,也有C#。我不知道对于原先BCB的忠实拥趸者来说,是更愿意转移到Delphi还是更愿意转移到C#,或者更愿意选择等待C++Builder .NET的出现?为了不偏不倚,我们下面给出C#的代码,同样在BDS 2006环境中调试完成:

public class WinForm : System.Windows.Forms.Form
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1046&d=b2l731
{
///


/// Required designer variable.
///

private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private Microsoft.Office.Interop.Excel.Application EA;

public WinForm()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

///


/// Clean up any resources being used.
///

protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code
///


/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///

private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(16, 264);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// WinForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(464, 310);
this.Controls.Add(this.button1);
this.Name = "WinForm";
this.Text = "WinForm";
this.ResumeLayout(false);
}
#endregion

///


/// The main entry point for the application.
///

[STAThread]
static void Main()
{
System.Windows.Forms.Application.Run(new WinForm());
}

private void button1_Click(object sender, System.EventArgs e)
{
button1.Text="Clicked";
object m=Type.Missing;
EA=new Microsoft.Office.Interop.Excel.Application();

EA.Visible=true;
EA.Caption="Invoke Excel from C#";

}
}

    之所以把这一长串代码都贴出来,是因为有一个特别的地方需要指出,也就是上面代码段中的System.Windows.Forms.Application.Run(new WinForm());。由于Excel命名空间也有一个Application(也就是Excel Application),所以我们只能在显示主窗体的时候用上完整的名称空间,否则编译无法通过。但是如果你的BDS打过了UPDATE 1的补丁,那么这个问题就不再存在。

    从代码的比较我们也可以看出,C#和Delphi .NET在通过Interop操作Office时,过程、代码都惊人的相似。这给我们也带来了巨大的好处。

    在以后的文章中,我会先从Excel开始详细讨论一些具体的操作,然后是Word,Outlook,最后是一些其他的程序。之所以这样考虑,是因为Microsoft本身对Interop操作的说明也集中在Excel/Work/Outlook上。我只是想保持我的文章与MSDN文档的一致性而已。

上篇文章:C++Builder 6中开发 Office 程序心得(二)
下篇文章:浅析C++中内存分配的方式
相关搜索:
  中搜索“用BDS 2006来开发基于Interop的Office程序 ”相关内容
  中搜索“用BDS 2006来开发基于Interop的Office程序 ”相关内容
  中搜索“用BDS 2006来开发基于Interop的Office程序 ”相关内容
  中搜索“用BDS 2006来开发基于Interop的Office程序 ”相关内容
  中搜索“用BDS 2006来开发基于Interop的Office程序 ”相关内容
  中搜索“用BDS 2006来开发基于Interop的Office程序 ”相关内容
C++Builder 研究 - http://www.ccrun.com © 2001,2011  总访问量: 43859365  来访IP: 107.22.52.86  晋ICP备05000574号
Tags: Borland CodeGear Embarcadero C++Builder Delphi VC++ C/C++ RAD Studio BCB BDS Source Code VCL MFC COM SDK Components Controls Developer Programmer 编程学习资料 源代码 源程序 源码 编程文档 经验技巧 组件 控件 元件 开源 函数 软件开发 一切尽在C++Builder研究!