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

Excel 的 Interop 编程(一)

关键字:Excel,Interop

作者:TR@SOE    更新:2008-09-03 15:55:38    浏览:23049

    从这里开始,我将和大家一起讨论Excel的Interop编程。我的参考资料大部分来自于MSDN的一篇文章:Understanding the Excel Object Model from a .NET Developer's Perspective

    Excel提供了上百个对象,可以用来与用户的程序进行交互。但是作为开始,我们应该着重注意如下的一些对象:

  • Application
  • Workbook
  • Worksheet
  • Chart
  • Range

    使用Delphi .NET以及C#开发Office Interop程序的一个(相比用VB开发的)不便之处在于VB在函数调用时是支持“可选参数”的,而我们即将会看到,对于Excel的Interop模型来说,一个方法往往有多达30多个可选参数。VB编程时可以简单的跳过,只提供必要的参数,而C#/Delphi则不行,必须将函数的参数全部传递进去,哪怕传递的就是Type.Missing。

    本文将首先讨论Application对象。对于Application对象,我们可以将其成员分为如下几类:

  • 控制Excel状态及显示的成员;
  • 返回对象的成员;
  • 执行动作的成员;
  • 处理文件的成员;
  • 其它成员

    让我们来分别进行讨论。

    控制Excel状态及显示的成员

    表1列出了控制Excel状态的成员:

属性 类型 说明
Cursor XlMousePointer (xlDefault, xlIBeam, xlNorthwestArrow,
xlWait)
设置鼠标的显示
EditDirectlyInCell boolean 设置是否能在单元格内直接编辑。如果是false,那么将只能在公式栏中进行修改。
FixedDecimal boolean 如果为true,那么所有的数字都将使用FixedDecimalPlaces属性的值显示固定位数的小数点后数字;否则就将忽略FixedDecimalPlaces属性的值。
FixedDecimalPlaces long FixedDecimal属性为true的前提下,决定了数值显示的小数点后的位数。
Interactive boolean 设置用户是否可以通过鼠标和键盘和Excel交互。如果将该属性设置为false,那么请一定要记得在合适的地方重新设置为true。Excel本身是不会重新设置该属性的。
MoveAfterReturn boolean 如果为true(缺省值),那么在按下回车后,当前选择就移到下一个单元格。
MoveAfterReturnDirection xlDirection (xlDown, xlToLeft, xlToRight, xlUp) 如果MoveAfterReturn为true,该属性指出了按下回车后,当前选择移动的方向。
ScreenUpdating boolean 如果该属性为true,Excel将在每个方法调用后刷新显示。为了节省时间并让你的应用更加专业,你可以在你的代码运行时关闭显示更新。一定记得在适当的时候重新设置该属性为true,Excel是不会重新设置该属性的。
SheetsInNewWorkbook long 设置了新建工作簿时包含的工作表的数量。
StandardFont String 设置Excel缺省缺省字体。在重新启动Excel前不会起作用。
StandardFontSize

long

设置Excel缺省缺省字体的大小。在重新启动Excel前不会起作用。
StartupPath(只读) String 返回Excel启动时加载项(add-ins)的绝对路径。
TemplatesPath(只读) String 返回包含模版的目录的绝对路径。这也是Windows的特殊目录之一。

    在上表中,其实我们用的最频繁的应该是ScreenUpdating属性。在该属性为false的时候,程序运行会更快一些,因为频繁更新Excel的显示是很浪费时间的。由于Excel不会重新设置该属性,所以如果你在代码段中将其设置为false,那么一定要确保代码中有一个地方将其重新设置为true。在Delphi/C#中,当然可以通过try/except或者try/finally来做到这点。

    Application对象还提供了一组属性来控制Excel的显示。下表是比较常用的几个:

属性 类型 说明
DisplayAlerts boolean 如果是true(缺省值),Excel在你代码运行时,在必要时候会显示警告信息:比如删除一个表单的时候。将该值设置为false将跳过这些警告。Excel会认为你选择了每个警告中的缺省返回值。
DisplayFormulaBar boolean 控制是否显示用来修改单元格的公式栏。缺省是显示。
DisplayFullScreen boolean 设置为true时,Excel将在全屏模式下运行(和将Excel窗口最大化不同)。缺省是false。

    在Visual Studio .NET中,标准的Microsoft Office工程模版只提供ThisApplication/ThisWorkbook这两个对象。所以在Application对象中包含了若干属性用来返回其它类型的对象。返回的对象可以是单个的,例如ActiveWindow;也可以是个集合,例如Charts。下表列出了返回对象的若干Application属性:

属性 类型 说明
ActiveCell Range 返回当前窗口(就是在最前面的窗口)中的活动单元格的引用。如果没有活动窗口,该属性将抛出错误。
ActiveChart Chart 返回当前获得的图表的引用。嵌入图表只有在被选中或激活时才是活动的。
ActiveSheet Object 返回活动工作簿中的活动工作表的引用。
ActiveWindow Window 返回活动窗口(最前面的窗口)的引用。如果没有活动窗口,则返回空。
Charts Sheets 返回Sheet对象的集合(Worksheet和Chart都继承自Sheet类)。其中包含了活动工作簿中的每个图表。
Selection Object 返回在应用中被选择的对象。可能是Range、Worksheet或任何其它对象。也适用于Window类,此时通常返回一个Range对象。如果没有对象被选中,那么返回空。
Sheets Sheets 返回活动工作簿中每个表单的引用的集合。
Workbooks Workbooks 返回所有打开的工作簿的引用的集合。

    我们用的最多的可能是Workbooks属性。该属性允许我们遍历打开的工作簿,打开或创建工作簿。下面我们详细讨论一下。

  • 创建一个新的工作簿

    下面的代码将创建一个新的工作簿:

// Delphi .NET
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1047&d=e40io4
procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);
begin
EWB:=EA.Workbooks.Add(System.Type.Missing);
end;

// C#
private void button2_Click(object sender, System.EventArgs e)
{
EWB = EA.Workbooks.Add(Type.Missing);
}

    请注意传递的参数:System.Type.Missing/Type.Missing。这个参数在日后将经常出现。所以我会在以后用STM变量来表示——少打几个字也是好的吗。它们可以分别被声明如下:

// Delphi .NET
var STM: TObject;
...
STM:=System.Type.Missing;

// C#
Object STM;
...
STM=Type.Missing;

  • 关闭打开的工作簿

     下面的代码可以关闭所有打开的工作簿:

// Delphi .NET
EA.Workbooks.Close;

// C#
EA.Workbooks.Close();

  • 打开现有工作簿

    利用Open方法可以打开现有的工作簿。这是一个拥有N多个可选参数的方法,而只有文件名才是必须的。

// Delphi .NET
procedure TWinForm.Button3_Click(sender: System.Object; e: System.EventArgs);
var EWB: Microsoft.Office.Interop.Excel.Workbook;
var FN: string;
begin
  if (OFD.ShowDialog = System.Windows.Forms.DialogResult.OK) then
  begin
    FN:=OFD.FileName;
    EWB:=EA.Workbooks.Open(FN, STM, STM, STM, STM, STM,
      STM, STM, STM, STM, STM,
      STM, STM, STM, STM);
  end;
end;

// C#
private void button3_Click(object sender, System.EventArgs e)
{
  String FN;
  Excel.Workbook EWB;
  if(OFD.ShowDialog()==DialogResult.OK)
  {
    FN=OFD.FileName;
    EWB=EA.Workbooks.Open(FN, STM, STM, STM, STM, STM,
      STM, STM, STM, STM, STM,
      STM, STM, STM, STM);
  }

    我们简单的回顾一下这14个STM参数的含义,有一些参数的含义还是自明的。但可惜的是,BDS中并没有提供这些方法的说明,因此我们只能借助VBA:

UpdateLinks 打开文件时是否要更新连接内容。
ReadOnly 是否只读。
Format 如果Microsoft Excel正在打开一个文本文件,则该参数用于指定分隔字符。
Password 该字符串指定打开一个受保护工作簿的密码。如果省略该参数并且指定工作簿已设置密码,则提示用户输入密码。
WriteResPassword 该字符串为一个写保护工作簿的写入权密码。如果省略该参数并且指定工作簿已设置密码,则提示用户输入密码。
IgnoreReadOnlyRecommended 如果该值为True,则设置Microsoft Excel不显示建议只读消息(如果该工作簿以“建议只读”选项保存)。
Origin 如果该文件为文本文件,则该参数用于指示该文件来源于何种操作系统(以便正确映射代码页和回车/换行(CR/LF))。可为以下XlPlatform常量之一:xlMacintosh、xlWindows 或 xlMSDOS。如果省略本参数,则使用当前操作系统。
Delimiter 如果该文件为文本文件并且Format参数为 6,则此参数用于指定用作分隔符的字符。例如,可使用Chr(9)代表制表符,使用“,”代表逗号,使用“;”代表分号或者使用自定义字符。如果该参数为字符串,则只使用该字符串的第一个字符。
Editable 如果该文件为Microsoft Excel 4.0加载宏,则该参数的值为True时可打开该加载宏以便在窗口中看到。如果该参数的值为False或者省略该参数,则该加载宏以隐藏方式打开,并且无法设为可见。本选项不能应用于由Microsoft Excel 5.0或更高版本的Microsoft Excel创建的加载宏。如果该文件是Excel模板,则参数的值为True时,会打开指定模板用于编辑。参数为False时,可根据指定模板打开新的工作簿。默认值为False。
Notify 当该文件不能以可读写模式打开时,如果该参数的值为True,则可将该文件添加到文件通知列表。Microsoft Excel将以只读模式打开该文件并轮询文件通知列表,当文件通知列表中的该文件可用时通知用户。如果该参数的值为False或省略该参数,则不请求任何通知,并且不能打开任何不可用的文件。
Converter 打开文件时试用的第一个文件转换器的索引号。首先使用的是指定的文件转换器:如果该转换器不能识别此文件,则试用所有的转换器。转换器索引号由FileConverters属性返回的转换器行号组成。
AddToMru 如果该值为True,则将该工作簿添加到最近使用的文件列表中。默认值为False。
Local 如果该值为True,则以Microsoft Excel(包括控制面版设置)的语言保存文件。如果该值为False(默认值),则以Visual Basic for Applications (VBA)的语言保存文件,其中Visual Basic for Applications (VBA)为典型安装的美国英语版本,除非VBA项目的Workbooks.Open来自旧的国际化的XL5/95VBA项目。
CorruptLoad 可为以下常量之一:xlNormalLoad、xlRepairFile和xlExtractData。如果未指定任何值,则默认值通常为普通状态,但如果Excel已尝试打开该文件,则可以是安全加载或数据恢复状态。首选值为普通状态。如果Excel在打开文件时停止操作,则为安全加载状态。如果Excel再次停止操作,则为数据恢复状态。

    对于Workbooks的更一步的操作会在以后的文章中继续讨论。

上篇文章:用BDS 2006来开发基于Interop的Office程序
下篇文章:浅析C++中内存分配的方式
相关搜索:
  中搜索“Excel 的 Interop 编程(一) ”相关内容
  中搜索“Excel 的 Interop 编程(一) ”相关内容
  中搜索“Excel 的 Interop 编程(一) ”相关内容
  中搜索“Excel 的 Interop 编程(一) ”相关内容
  中搜索“Excel 的 Interop 编程(一) ”相关内容
  中搜索“Excel 的 Interop 编程(一) ”相关内容
C++Builder 研究 - http://www.ccrun.com © 2001,2011  总访问量: 43667516  来访IP: 23.20.54.196  晋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研究!