如何用BCB打开EXCEL文件

           C++Builder是Borland公司继Delphi之后又一成功的产品,她集VB、VC++   及   Delphi   的优点于一体而深得C语言爱好者的青睐。由于多数操作者爱用   MicroSoft公司的Excel组织数据,为此本文介绍了用C++Builder存取Excel   文件的两种方法。   

          一.用OLE技术操纵Excel   

          OLE(对象链接与嵌入)是微软提出的标准,是应用程序间交换数据、相互操作的一种方式,MS   OFFICE   提供了很强的   OLE   服务功能,VB、Delphi   及C++Builder等语言都可以以客户方式向Excel提交命令,以存取其数据,其中VB和Delphi最为简单,在语法上就采用类VBA的语句,本报九九年第48期的《在Delphi中操作Excel》一文曾介绍了Delphi的做法。我们原以为C++Builder照搬Delphi,结果语法编译都未能通过,查不到这方面具体介绍的资料。经反复试验方知:原来C++Builder采用间接的办法,利用变体类Variant所提供的四个“方法”向OLE服务程序提交操纵命令:   

      Variant     Variant::OlePropertyGet(属性名,参数….); 
    //   取对象属性 
      Void           Variant::OlePropertySet(属性名,参数….); 
    //   设置对象属性     
      Variant     Variant::OleFunction(函数名,参数….); 
        //   运行对象的函数 
      void           Variant::OleProcedure(过程名,参数….); 
      //   运行对象的过程 

其头文件“vcl\utilcls.h”必须嵌在用户程序中, 
对于这四个长长的方法名可在程序中用宏语句重新定义一下:   
                      #define       PG       OlePropertyGet 
                      #define       PS       OlePropertySet 
                      #define       FN       OleFunction 
                      #define       PR       OleProcedure 

例如对于VB的提交语句:     
Ex.ActiveWorkBook.ActiveSheet.Cells(1,2).Value=3 
为便于理解在C++Builder对应的语句可分解为如下四句: 
                    Variant   t1=Ex.OlePropertyGet( "ActiveWorkBook "); 
                    Variant   t2=t1.OlePropertyGet( "ActiveSheet "); 
                    Variant   t3=t2.OlePropertyGet( "Cells,1,2); 
                                          t3.OlePropertySet( "Value ",3); 
可去掉中间变量将这四句合为一句,就是: 
      Ex.PG( "ActiveWorkBook ").PG( "ActiveSheet "). 
PG( "Cells ",1,2).PS( "Value ",3);     
我们将下面的VB程序片段改成对应的C++Builder程序以供参考: 
Private   Sub   Command1_Click()           '   Visual     Basic程序片段 
        Dim     Ex     As     Object,Wb     As   Object,   Sh1   As   Object 
        Set     Ex   =   CreateObject( "Excel.Application ") 
        Ex.WorkBooks.Open( "c:\book1.xls ") 
        Set     Wb   =   Ex.Activeworkbook 
        Set     Sh1   =   Wb.ActiveSheet 
        Text1.Text   =   Sh1.Cells(1,   1).Value 
        For     i   =   1   To   10:   For     j   =   1   To   10 
                Sh1.Cells(i,   j).Value   =   i   *   100   +   j 
        Next   j:   Next   i 
        Wb.save:   Wb.Close:   Ex.Quit 
End   Sub     '     -   -   -   -   -   --   -   -   -   -   -   -   -   -   -   -   

#include   "Unit1.h "                 //   C++Builder程序片段 
#include   "vcl\utilcls.h "     //   util   classes实用类说明 
//     …省写此处原一段代码 
//     请在此处插入上面提及的四个宏定义语句 
void   __fastcall   TForm1::Button1Click(TObject   *Sender) 
{         Variant   Ex,Wb,Sh1; 
          Ex=Variant::CreateObject( "Excel.Application "); 
          Ex.PG( "WorkBooks ").PR( "Open ", "c:\\book1.xls "); 
          Wb=Ex.PG( "ActiveWorkBook ");   Sh1=Wb.PG( "ActiveSheet "); 
          Edit1-> Text=Sh1.PG( "Cells ",1,1).PG( "Value "); 
          for   (int   i=1;i <=10;i++) 
                for   (int   j=1;j <=10;j++) 
                      Sh1.PG( "Cells ",i,j).PS( "Value ",i*100+j); 
          Wb.PR( "Save ");   Wb.PR( "Close "); 


      使用这种方法的程序运行时,必须保证系统中同时有MS   OFFICE;下面我们再介绍另一种脱离MS   OFFICE也能存取Excel表格的方法。   
      二.用ODBC数据库技术存取Excel   

    ODBC就是开放式数据库链接标准,不同种类的数据库只需提供各自的ODBC   驱动程序就可按相同的命令操纵,微软同样为Excel提供了ODBC驱动程序,我们可在程序中象数据库一样存取Excel表格。定义好ODBC数据源后,实际试验中并没有如想象的那样简单,在控件Table的属性TableName中总是检索不到表名,同样也没有相关的资料可供查阅。通过对Excel的分析,终于发现了问题的关键所在:ODBC的表名并不就是Excel的工作表名(如Sheet1),在Excel   表格中必须对要求操作的行列区域定义一个“名称”作为数据库的表名,该区域的首行各列必须是字段名(否则首行数据会当成字段名),可以定义多个表名。具体操作步骤如下:   

      1.在Excel上定义“表名”:   

    运行Excel程序,打开或新建一表格,按下鼠标左键选择一片区域(起始行先填上字段名),再将鼠标位置点到左上角的地址栏,输入一表名如ABC,或者在菜单上选:“插入(I)”-“名称(N)”-“定义(D)”,再输入表名(若已定义,   可在此处删除掉),存盘退出(假定文件名取为c:\Book.xls),若嫌字段名行多余,存盘前可隐藏掉;   

    2.定义ODBC数据源:   

  从Windows桌面“我的电脑 "进入“控制面板”,双击“32位ODBC”图标,运行“用户DSN”中的“添加(D) "后选“Excel   Driver(*.xls) ",   再点“完成”便弹出对话框,在“数据源名(N) "右边填一名称,如:excel01,在“版本(V) "上选“Excel97 ",   点中“选项”取消“只读”,在“选定工作目录”中,选定Excel文件名(本例   c:\Book1.xls),再点“确定”直至退出;   

      3.设置Database控件避免登录检查:   

      运行C++Builder,在Form1中加上Data   Access的三个控件:Database1、   DataSource1、Table1,加入Database1的目的是为了避免打开数据库时出现登录框,为此双击此控件弹出一对话框,在Alias   name中选ODBC数据源名(本例为Excel01),在Name中填上一新的别名(本例取Excel02),再点“Defaults”   出现一批参数缺省值,最后取消Options中的两项“Login   prompt "与 "Keep   inactive   connect”,点OK退出;   

      4.设置其它控件属性:   

      将Table1的属性DatabaseName选为步骤3中的新别名Excel02,再将另一属性TableName选为步骤1的表名(本例为ABC);将控件DataSource1的属性   DataSet选为Table1;双击Form1,在FormCreate事件子程序内加上一句   Table1-   > Open(   );   

      5.查看数据库内容:   

      为了直接看到Excel数据,在Form1中再加上Data   Controls的控件DBGrid1   和DBNavigator1,将两者的属性DataSource都选为DataSource1,双击Table1   的属性Active将值改为true,等待数秒就可看到DBGrid1中出现数据,最后恢复Tabel1-   > Active为false;   

        注意:程序编译前,必须将刚打开的表关闭,即:使Table1-   > Active为false,   否则程序运行时报告出错,因为Excel表总是被ODBC以“独占”方式打开;   

        我们使用的是C++   Builder   4.0专业版,电子表格为Excel   97。

http://topic.csdn.net/u/20080214/15/9e9c4392-bfce-4b16-bc6f-ace6f6c5ea4a.html   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值