李广超(工程物探院) [摘 要] 利用COM编程中的自动化技术,打开Excel文件,进行绘图,达到快速制作油气和工程物探测井柱状图的目的,使用该方法充分利用Excel的强大功能,方便用户。[关键词] 〖HTSS〗Excel COM 测井柱状剖面图 Excel是一个出色的电子表格软件,是迄今为止市场上功能最强的电子表格软件,从大型的企业公司到个人家庭都是应用最广泛的,有良好的用户基础,具有友好的界面,功能强大的数据计算能力和内部函数,还可以把数据以各种统计图的形式形象的表示出来,进行数据分析。 Excel既是一个独立运行的程序,也是一个遵循COM(Commponent Object Model组件对象模型)标准的服务器接口构件,COM是微软公司制定的构造二进制兼容软件的规范,目的是让开发者和使用者脱离,这样用户可以使用COM构件随意组装,利用它们实现自己的功能,完成软件开发工作,通过简单的编程达到专业的效果。 石油测井或水利工程测井柱状剖面图,来表征和展示地下的各种地质信息。柱状剖面图简称柱状图,以探测深度作为垂直坐标,地层、岩性、以及各种测井曲线和解释成果用符号表示出来。 测井主要以各种岩石的物性差异为基础,通过相应的地球物理方法,连续测定反映岩石物理性质的参数,并在分析这些物理参数沿井深剖面变化规律的基础上,了解油气储集层的地下分布规律,评价油气储集层的生产能力以及解决工程地质方面的问题。测井已经成为目前石油和工程地质上不可缺少的手段,对测井资料利用的好坏程度将直接和间接地影响勘探成果的质量,而资料成图在利用测井资料方面占着至关重要的角色。当前测井绘图方面的软件都有着不同程度的不尽人意之处,结合工作实际,编制了该程序。 1 基本设计思想 将测井数据导入Excel,解释成果按照一定的格式输入。启动程序,打开数据文件,程序提示你输入标题、比例、字体等,然后程序根据你选择的数据页面控制Excel自动绘制图形,绘制结束后用户不满意的地方还可以Excel中再修改。在绘制柱状图的岩性时,利用的是图库调入,节约了绘制符号的时间,提高了效率,另外,用户还可以自己添加图库,以期能够更加完美地表达自己的意思,做到“以人为本”的设计理念。图1 基本流程2 编程实现 在程序设计的时候,利用的编译环境是C++ Builder5.0,用到的技术是COM编程中的Automation。在编程的时候,力求多做工作,就会很容易上手,用的时候也会很轻松。 2.1 主要编程技术 在编程过程中,我选用引入类型库的方法,这样可以利用类型库查询服务器对象(也即Excel)在C++外套包装下的说明,可以查询要用到的方法的参数类型和返回值,这一点很重要。在调用中,采用了Interface智能接口的方法,通过函数的调用,返回需要的对象,然后就可以采用伪指针的语法直接调用该对象的方法。 2.2 启动Excel服务器 部分实现的代码,在打开文件时如下所示:Excel_tlb :: TCOM_Application m_XLApp ; //定义Excel对象Excel_tlb :: WorksheetPtr m_Workbook ;//定义worksheet对象Excel_tlb :: WorkbookPtr m_Workbook ;//定义workbook对象Void_fastcall TForm1:Button1Click(Toject *Sender){ if(OpenDialog1->Execute()){ try { if (!m_XLApp) //判断Excel服务器是否打开 { m_XLApp=CoApplication_::Create(); //没有打开,就创建Excel服务器对象 m_XLApp->set_Visible(0, true); //使Excel显示运行 m_XLApp->Caption=WideString(OpenDialog1->FileName );//设置Excel的标题 m_Workbook=m_XLApp->Workbooks->Add(WideString(OpenDialog1->FileName));//打开选择的Excel文件薄 } // end if else { m_XLApp->set_Visible(0, true);//如果服务器已经打开,就显示出来 m_XLApp->Caption=WideString(OpenDialog1->FileName ); m_Workbook=m_XLApp->Workbooks->Add(WideString( OpenDialog1->FileName)); } }//end of try catch(...) { ShowMessage(″Cant Open File!″); }} 上面这段程序比较简单易懂,也有比较清楚地注释,不用多做解释,其功能就是在程序打开文件的菜单里,控制Excel的启动并打开了用户所选择的Excel文件。这一步对程序来说却是很重要的,没有这些其他就无从谈起。m_XLApp->Workbooks->Add(xlWBATWorksheet,0);m_Worksheet=m_XLApp->Workbooks->get_Item(1)->Worksheet->get_Item(1);m_Worksheet->Name=WideString(“我添加的页面");for(int i=1;i<=20;i++){m_Worksheet->Cells->set_Default(i,1,i*10);m_Worksheet->Cells->set_Default(i,2,i*15);}m_SheetRange=m_Worksheet->get_Range(“C1:F10");m_SheetRange->Formula=“RAND()"; 上面的一段程序用于在Excel中添加一个工作表,然后将它赋给一个工作表对象指针,将此工作表的名字改为“我的添加页面”;在循环里在工作表中插入了40个数据,分别添加在工作单的第一、第二列的前二十个单元格中,最后两句用0和1之间的随机数填充C1到F10之间的所有单元。这是向Excel单元格中写入数据,那么同样的道理,在绘制图形的时候,就可以从其中读取数据,绘制所需的图件了。 3 实例显示 下面给出该软件绘制的某钻孔石油综合测井地质剖面图的实例,只给出原图的部分图件如图2所示。图2 石油测井柱状图 下面的是水利工程综合测井柱状图,此图中曲线的数据是模拟的。图3 工程测井柱状图 4 作用及意义 此程序主要应用自动控制技术,操纵Excel,从Excel中读取数据,并在其中绘制图形,在编程中有一定难度,却实现了高速绘制图形,适用于原始和解释的资料成图,提高了工作效率,为在综合测井图形的绘制方面提供了新的途径。 该程序针对的是笔者单位在水利工程综合测井成图的格式编写的,有一定的局限性,改变绘制图形的框架结构,需要对程序作一点调整。 |