C++操作Excel学习笔记(四)

【当前博文转载自 http://blog.csdn.net/sgdgoodboy/article/details/2102628】
【本文前半部分与word相关,发在 C++操作Word学习笔记(三)】

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 连续分隔符。值为TRUE
Tab 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 设置主格线,TRUE
Axis::SetHasMinorGridlines 设置次格线,FALSE
Axis::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++教材的“高级主题部分”会有涉及。

你可能感兴趣的:(CPP与Excel)