二 EXCEL篇及命名空间说明 1 Excel组件对象模型 Microsoft Office Excel 2003文档中的数据是高度结构化的,因此Excel对象模型也具有层次结构并且简单明了。Excel 提供了数百个您可能需要与之交互的对象,但是最为重要的是以下四个对象:Application 对象、Workbook 对象、Worksheet 对象和Range 对象。很多工作都是围绕这四个对象进行的。Application 对象。Application 对象表示 Excel 应用程序本身。Application 对象提供了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信息。Workbook 对象。Workbook 类表示 Excel 应用程序内的单个工作簿。Application 类的许多成员同时也是 Workbook 类的成员。在这种情况下,属性应用于特定的工作簿(而非应用于活动工作簿)。Worksheet 对象。虽然 Worksheet 类提供了大量成员,但大部分属性、方法和事件都与 Application 和/或 Workbook 类提供的成员相同或相似。Excel 提供 Sheets 集合作为 Workbook 对象的属性,但 Excel 中没有 Sheet 类。实际上,Sheets 集合的每个成员不是 Worksheet 对象就是 Chart 对象。Range 对象。Range 对象是 Excel 应用程序中最常用的对象。在能够处理 Excel 内的任何范围之前,必须将它表示为 Range 对象,并处理该对象的方法和属性。Range 对象表示一个单元格、一行、一列、包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。对于Microsoft Office Excel 2003,通常可以在..//Microsoft Office//OFFICE11// EXCEL.exe获得相关接口类。常用的有_Application, Workbooks, _Workbook, Worksheets, _Worksheet, Range,以及用于生成图表的_Chart等。 另外,使用MS Graph对象的技术同样可以生成数据图表。但是,对象写入大数据量非常缓慢的。MS Graph工作原理是每写入一个数据就要对图表进行更新,因此,MS Graph对于小数据制作图表是合适的(实现代码比EXCEL要少),但对于大数据这种工作原理是难以忍受的。尽管如此,EXCEL与MS Graph的接口函数却是非常相似的。 2 Excel启动与退出 使用Application 对象,关联接口、释放接口。具体代码如下:_Application theExcelApp;theExcelApp.CreateDispatch("Excel.Application", NULL); //关联接口退出theExcelApp.Quit(); 退出theExcelApp.ReleaseDispatch(); //释放接口 3 Excel打开记事本(*.txt) 通常,我们需要从文本(*.txt)文件中载入数据。Excel的Workbooks对象提供了打开文本的函数OpenText ()。OpenText()函数声明如下:OpenText(LPCTSTR Filename, const VARIANT& Origin, const VARIANT& StartRow, const VARIANT& DataType, long TextQualifier, const VARIANT& ConsecutiveDelimiter, const VARIANT& Tab, const VARIANT& Semicolon, const VARIANT& Comma, const VARIANT& Space, const VARIANT& Other, const VARIANT& OtherChar, const VARIANT& FieldInfo, const VARIANT& TextVisualLayout, const VARIANT& DecimalSeparator, const VARIANT& ThousandsSeparator, const VARIANT& TrailingMinusNumbers, const VARIANT& Local)参数说明如下:Filename 文本路径。Origin 文件原始格式。通常值为936,表示简体中文。StartRow 导入起始始行。在本报告中第一行为标题行,导入起始行为2。DataType 数据类型。值设为1。TextQualifier 文本格式。值为1。ConsecutiveDelimiter 连续分隔符。值为TRUETab Tab分隔符。值为FALSE。Semicolon 分号分隔符。值为FALSE。Comma 逗号分隔符。值为FALSE。Space 空格分隔符。本电子报告中通常以空格作为分隔符,因此值为TRUE。如若采用其他分隔符,请适当修改。Other 其它分隔符。值为FALSE。OtherChar 其他文本识别符号。值为NULL。FieldInfo 区域信息。同载入文本列数据格式相关。设为VarOpt。TextVisualLayout 文本可见版式。设为VarOpt。DecimalSeparator 小数分隔符。设为VarOpt。ThousandsSeparator 千位分隔符。设为VarOpt。TrailingMinusNumbers 按负号跟踪负数。设为TRUE。Local 本地数据。设为VarOpt。以上各参数请根据适当需要修改,并根据调试VBA宏代码获得参数值。要说明的是,这种方法载入数据将从B列往后分布。即,如果是TXT文本里有两列数据,那么载入EXCEL后,这两列数据将分布在B列与C列,而A列为空。这个原因我也一直不得其解(不知道是我们合作方提供的TXT文本本身设置问题还是别的问题)。这点请读者注意,也请高手指点。 4 获取Excel行数目 载入记事本数据后,需要调用_Worksheet对象获得数据的行数目。具体代码如下:_Worksheet ::GetUsedRange();获得已用区域,返回Range对象。注意,这里不能调用_Worksheet ::GetRange();Range:: GetRows(); 获得行对象。返回Range对象。Range:: GetCount();获得行数目。获得行数目在进行生成图表是很重要的。在生成图表时,载入源数据的区域时需要获得行数目。 5 生成Excel图表及格式 使用对象。以下要设置其格式。_Chart:: SetChartType 设置图表类型。如果使用无数据点平滑线散点图,值为73。其它图表类型请自己录制VBA宏然后调试获得参数值。_Chart:: SetSourceData生成图表的原数据。传递一个Range对象。_Chart:: SetHasLegend 标注。设为FALSE,不显示标注。_Chart:: SetHasTitle 标题。设为TRUE,显示标题。并假设获得行数目为432,则SetSourceData的参数值为Range(“B1”, “C432”)。 如果需要对网格线进行格式控制,需要调用以下函数:_Char::Axes 返回Axis对象Axis::SetHasMajorGridlines 设置主格线,TRUEAxis::SetHasMinorGridlines 设置次格线,FALSEAxis::GetMajorGridlines 获得主格线对象(前提是设置主格线为TRUE),返回Gridlines对象Gridlines::GetBorder 获得边框对象,返回Borders对象Borders::SetColorIndex 设置颜色,57表示黑色Borders::SetLineStyle 设置线条格式,-4118表示虚线Borders::SetWeight 设置粗细以上Borders各参数值可根据需要适当修改。 Axis::SetCrossesAt 可设置坐标轴相交位置。通常需要Axis::GetMinimumScale获得最小刻度值,然后相交于最小刻度值。 6 设置标题文字及曲线格式 使用AxisTitle ,,Font对象设置文字,包括设置文字上标等。注意,Excel并不提供类似于Word的Selection对象,要进行文字格式控制,通常需要用到Characters对象,即对指定文字进行格式控制。使用Series,Borders对象可对曲线进行控制。可利用_Char:: SeriesCollection返回一个Series对象。 7 保存 使用_Workbook:: SaveAs函数。具体参数值设置较为简单,参看VBA宏代码即可。此处略。 8 命名空间namespace 由于许多Word的对象与Excel对象的名字是相同的,因此,必须使用名字空间将其区分。命名空间的使用方法很简单,在.h和.cpp文件分别添加namespace mynamespace{ //Statement;}把名字有冲突的类的声明与实现放入namespace的作用域里。然后调用类是前面加命名空间作用符。举例如下:Word和Excel都有_Application对象,如果不使用命名空间则会发生编译错误。可在excel.h添加namespace myExcel{ class _Application : public COleDispatchDriver{ //Statement;}}在excel.cpp将所有_Application的方法放入到命名空间中。namespace myExcel{(_Application的方法实现代码)}调用Excel的_Application对象类时,使用方法为myExcel:: _Application _myExcelApp;即声明该_Application属于myExcel命名空间作用域。关于命名空间在C++教材的“高级主题部分”会有涉及。