CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

OLE问题:如何打开一个Excel模板,对单元格进行操作

楼主xcling00()2004-09-04 14:23:33 在 C++ Builder / 基础类 提问

学习中遇到如下问题:  
  Variant   Excel,   Workbook,   ActiveSheet;                
  AnsiString   sFileName;  
  try  
  {  
    Excel   =   CreateOleObject("Excel.Application");  
    Excel.OlePropertySet("Visible",   (Variant)false);        
    Workbook   =   (Excel.OlePropertyGet("Workbooks")).OleFunction("Add");  
    ActiveSheet   =   Workbook.OlePropertyGet("ActiveSheet");        
  }  
  catch(...)  
  {  
          MessageDlg("无法启动Excel!",mtError,TMsgDlgButtons()<<mbYes,0);  
        return;  
  }  
   
  Variant   Cell   =   Excel.OlePropertyGet("Cells",   1,   6);  
  Cell.OlePropertySet("Value",   "表单一");  
   
  以上运行是正确的。。可是如果我把下面这句:  
    Workbook   =   (Excel.OlePropertyGet("Workbooks")).OleFunction("Add");  
  换成下面这句:(其它不变)  
    Workbook   =   (Excel.OlePropertyGet("Workbooks")).OleFunction("Open","C:\Table1.xlt");     //为了打开一个已有的Excel模板。  
  就会在下面这句上出错:Cell.OlePropertySet("Value",   "表单一");  
   
  请问为什么这样不行?如果想打开一个模板进行操作,该如何做? 问题点数:100、回复次数:10Top

1 楼zihan(子寒)回复于 2004-09-04 14:50:54 得分 10

","C:\Table1.xlt");  
   
  改为  
  "C:\\Table1.xlt")  
  试试。Top

2 楼xcling00()回复于 2004-09-04 15:11:30 得分 0

哦 不好意思是我写错了。程序里我就是这样写的:"C:\\Table1.xlt")Top

3 楼xcling00()回复于 2004-09-05 20:30:40 得分 0

自己顶一下!  
  哪位帮忙指正一下错在哪里啊?Top

4 楼quickreport(快速报告)回复于 2004-09-06 00:01:54 得分 20

用OLE操作Excel(目前最全的资料)(04.2.19更新)  
  作者:   ccrun    
   
   
   
  要在应用程序中控制Excel的运行,首先必须在编制自动化客户程序时包含Comobj.hpp  
  #include   "Comobj.hpp"  
   
   
   
  C++   Builder把Excel自动化对象的功能包装在下面的四个Ole   Object   Class函数中,应用人员可以很方便地进行调用。  
  设置对象属性:void                 OlePropertySet(属性名,参数……);  
  获得对象属性:Variant           OlePropertyGet(属性名,参数……);  
  调用对象方法:1)   Variant     OleFunction(函数名,参数……);  
                            2)   void           OleProcedure(过程名,参数……);  
   
   
   
  在程序中可以用宏定义来节省时间:  
   
   
   
  #define       PG       OlePropertyGet  
  #define       PS       OlePropertySet  
  #define       FN       OleFunction  
  #define       PR       OleProcedure  
   
   
   
  举例:  
  ExcelApp.OlePropertyGet("workbooks").OleFunction("Add");  
  可写为  
  ExcelApp.PG("workbooks").FN("Add");  
   
   
   
  C++   Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft   Word   Visual   Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。  
  首先定义以下几个变量:  
  Variant   ExcelApp,Workbook1,Sheet1,Range1;  
   
   
   
  1、Excel中常用的对象是:Application,Workbooks,Worksheets等。  
       
      ★创建应用对象★  
                Variant   ExcelApp;  
                ExcelApp   =   Variant::CreateObject   ("Excel.Application");  
                或者  
                ExcelApp   =   CreateOleObject   ("Excel.Application");  
   
   
   
      ★创建工作簿对象★  
                Variant   WorkBook1;  
                WorkBook1   =   ExcelApp.PG("ActiveWorkBook");  
   
   
   
      ★创建工作表对象★  
                Variant   Sheet1;  
                Sheet1   =   WorkBook1.PG("ActiveSheet");  
   
   
   
      ★创建区域对象★  
                Variant   Range;  
                Range   =   Sheet1.PG("Range","A1:A10");          
                或者使用  
                Excel.Exec(PropertyGet("Range")<<"A1:C1").Exec(Procedure("Select"));  
   
  Top

5 楼quickreport(快速报告)回复于 2004-09-06 00:02:17 得分 20

2、常用的属性操作:  
       
      ★使Excel程序不可见★  
                ExcelApp.PS("Visible",   (Variant)false);  
                   
      ★新建EXCEL文件★  
           
          ◎   新建系统模板的工作簿  
                ExcelApp.PG("workbooks").FN("Add")             //默认工作簿  
                ExcelApp.PG("workbooks").FN("Add",   1)       //单工作表  
                ExcelApp.PG("workbooks").FN("Add",   2)       //图表      
                ExcelApp.PG("workbooks").FN("Add",   3)       //宏表    
                ExcelApp.PG("workbooks").FN("Add",   4)       //国际通用宏表  
                ExcelApp.PG("workbooks").FN("Add",   5)       //与默认的相同  
                ExcelApp.PG("workbooks").FN("Add",   6)       //工作簿且只有一个表  
                或者使用ExcelApp的Exec方法  
                Excel.Exec(PropertyGet("Workbooks")).Exec(Procedure("Add"));  
          ◎   新建自己创建的模板的工作簿  
                ExcelApp.PG("workbooks").FN("Add",   "C:\\Temp\\result.xlt");  
                   
      ★打开工作簿★  
                ExcelApp.PG("workbooks").FN("open",   "路径名.xls")      
                   
      ★保存工作簿★  
                WorkBook1.FN("Save");                         //保存工作簿  
                WorkBook1.FN("SaveAs",   "文件名");//工作簿保存为,路径注意用"\\"  
                   
      ★退出EXCEL★  
                ExcelApp.FN   ("Quit");  
                ExcelApp   =   Unassigned;  
                或者  
                ExcelApp.Exec(Procedure("Quit"));  
                   
      ★操作工作表★  
           
          ◎   选择选择工作表中第一个工作表  
                Workbook1.PG("Sheets",   1).PR("Select");  
                Sheet1   =   Workbook1.PG("ActiveSheet");  
           
          ◎   重命名工作表  
                Sheet1.PS("Name",   "Sheet的新名字");  
           
          ◎   当前工作簿中的工作表总数  
                int   nSheetCount=Workbook1.PG("Sheets").PG("Count");                
                   
      ★操作行和列★  
         
          ◎   获取当前工作表中有多少行和多少列:  
                Sheet1.PG("UsedRange").PG("Columns").PG("Count");   //列数  
                Sheet1.PG("UsedRange").PG("Rows").PG("Count");         //行数  
           
          ◎   设置列宽  
                ExcelApp.PG("Columns",   1).PS("ColumnWidth",   22);  
                或者  
                Range   =   ExcelApp.PG("Cells",   1,   3);  
                Range.PS("ColumnWidth",   22);              
           
          ◎   设置行高  
                ExcelApp.PG("Rows",   2).PS("RowHeight",   25);  
                或者  
                Range   =   ExcelApp.PG("Cells",   2,   1);                  
                Range.PS("RowHeight",   25);            
           
          ◎   在工作表最前面插入一行  
                Sheet1.PG("Rows",   1).PR("Insert");                  
           
          ◎   删除一行  
                ExcelApp.PG("Rows",   2).PR("Delete");   //将第2行删除  
   
   
   
                //   本文作者:ccrun   ,如转载请保证本文档的完整性,并注明出处。  
                //   欢迎光临   C++   Builder   研究   www.ccrun.com  
                //   摘自:http://www.ccrun.com/doc/go.asp?id=529  
                   
      ★操作单元格★  
       
          ◎   设置单元格字体  
                  Sheet1.PG("Cells",   1,   1).PG("Font").PS("Name",   "隶书");   //字体  
                  Sheet1.PG("Cells",   2,   3).PG("Font").PS("size",   28);           //大小  
                   
          ◎   设置所选区域字体  
                Range.PG("Cells").PG("Font").PS("Size",   28);  
                Range.PG("Cells").PG("Font").PS("Color",   RGB(0,   0,   255));  
                其中参数的设置:  
                Font       Name   :   "隶书"                               //字体名称  
                              Size   :   12                                       //字体大小  
                            Color   :   RGB(*,*,*)                       //颜色  
                    Underline   :   true/false                       //下划线  
                            Italic:   true/false                       //斜体  
           
          ◎   设置单元格格式为小数百分比  
                Sheet1.PG("Cells",   1,   1).PS("NumberFormatLocal",   "0.00%");  
   
   
   
          ◎   设定单元格的垂直对齐方式  
                Range   =   ExcelApp.PG("Cells",   3,   4);  
                //   1=靠上   2=居中   3=靠下对齐   4=两端对齐   5=分散对齐  
                Range.PS("VerticalAlignment",   2);                
           
          ◎   设定单元格的文本为自动换行  
                Range   =   ExcelApp.PG("Cells",   3,   4);  
                Range.PS("WrapText",   true);  
                 
      ★单元格的合并★  
   
   
   
          ◎   Range   =   Sheet1.PG("Range",   "A1:A2");                     //A1和A2单元格合并  
                String   strRange   =   "A"   +   IntToStr(j)   +   ":"   +   "C"   +   IntToStr(j);   //比如:A1:C5  
                Range1=Sheet1.PG("Range",   strRange.c_str());   //可以用变量控制单元格合并  
                Range1.FN("Merge",   false);  
                   
      ★读写单元格★  
   
   
   
          ◎   指定单元格赋值  
                String   strValue   =   "abcdefg";  
                Sheet1.PG("Cells",   3,   6).PS("Value",   strValue.c_str());    
                Sheet1.PG("Cells",   j,   1).PS("Value",   "总记录:"   +   String(j-6));  
                或者使用  
                Excel.Exec(PropertyGet("Cells")<<1<<3).Exec(PropertySet("Value")<<15);  
   
   
   
          ◎   所选区域单元格赋值  
                Range.PG("Cells").PS("Value",   10);            
   
   
   
          ◎   所选区域行赋值  
                Range.PG("Rows",1).PS("Value",   1234);      
   
   
   
          ◎   工作表列赋值  
                Sheet1.PG("Columns",1).PS("Value",   1234);    
   
   
   
          ◎   读取取值语句:  
                String   strValue   =   Sheet1.PG("Cells",   3,   5).PG("Value");  
   
   
   
      ★窗口属性★  
           
          ◎   显示属性  
                ExcelApp.PS("Windowstate",   3);               //最大化显示  
                              1---------xlNormal                         //正常显示  
                              2---------xlMinimized                   //最小化显示  
                              3---------xlMaximized                   //最大化显示  
   
   
   
          ◎   状态栏属性  
                ExcelApp.PS("StatusBar",   "您好,请您稍等。正在查询!");  
                ExcelApp.PS("StatusBar",   false);           //还原成默认值  
   
   
   
          ◎   标题属性:  
                ExcelApp.PS("Caption",   "查询系统");  
                 
  3、操作图表  
           
      ★添加图表  
             
            Variant   Chart;      
            Chart   =   ExcelApp.Exec(PropertyGet("Charts")).Exec(Function("Add"));  
            ExcelApp.Exec(PropertySet("Visible")   <<   true);  
            Chart.Exec(PropertySet("Type")   <<   -4100);  
       
      ★滚动图表  
       
            for(int   nRotate=5;   nRotate   <=   180;   nRotate   +=   5)  
            {  
                      Chart.Exec(PropertySet("Rotation")   <<   nRotate);  
            }  
            for   (int   nRotate   =   175;   nRotate   >=   0;   nRotate   -=   5)  
            {  
                      Chart.Exec(PropertySet("Rotation")   <<   nRotate);  
            }  
             
  另外,为保证程序能正常运行,需要在程序中判断目标机器是否安装了Office;  
  try  
  {  
          ExcelApp   =   Variant::CreateObject   ("Excel.Application");  
  }  
  catch(...)  
  {  
          ShowMessage("运行Excel出错,请确认安装了Office");  
          return;  
  }    
   
   
   
   
  #include   "comobj.hpp"  
  //---------------------------------------------------------------------------  
  //   对指定Excel文件中的指定列进行排序  
  //   strExcelFileName   :   excel文件名  
  //   nCol   :   指定的列号  
  //   nSortStyle   :   1:升序,2:降序  
  void   SortExcelColumn(String   strExcelFileName,   int   nCol,   int   nSortStyle)  
  {  
          Variant   vExcelApp,   vWorkbook,   vRange;  
          vExcelApp   =   Variant::CreateObject("Excel.Application");  
          vExcelApp.OlePropertySet("Visible",   false);  
          vExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open",   strExcelFileName.c_str());  
          vWorkbook   =   vExcelApp.OlePropertyGet("ActiveWorkbook");  
          vExcelApp.OlePropertyGet("Columns",   nCol).OleProcedure("Select");  
          vExcelApp.OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",   1,   nCol).OleProcedure("Select");  
          vRange   =     vExcelApp.OlePropertyGet("Selection");  
          vRange.Exec(Function("Sort")<<vExcelApp.OlePropertyGet("Selection")<<nSortStyle);  
          vWorkbook.OleProcedure("Save");  
          vWorkbook.OleProcedure("Close");  
          vExcelApp.OleFunction("Quit");  
          vWorkbook   =   Unassigned;  
          vExcelApp   =   Unassigned;  
          ShowMessage("ok");  
  }  
   
   
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
          //   对C:\123\123.xls文件中第一个Sheet的第四列进行升序排序  
          SortExcelColumn("C:\\123\\123.xls",   4,   1);  
  }  
  //---------------------------------------------------------------------------  
  Top

6 楼clong320(clong320)回复于 2004-09-06 08:48:09 得分 0

收藏此贴Top

7 楼xcling00()回复于 2004-09-06 09:41:27 得分 0

谢谢。我就是看了这篇文章在学习!可是如何打开一个Excel模板,对单元格进行操作   就出错!难道不能对模板进行操作吗?Top

8 楼yuyulily(打工仔)回复于 2004-09-06 10:18:20 得分 20

回复人:Hank(2000-08-23   10:02:00   )   得45分    
  以前写过一个,你可以直接参考,具体数据部分你就直接修改了,参看代码:  
   
   
   
  //********************//  
   
   
   
              SaveDialog1->Filter="*.XLS|*.XLS";  
              SaveDialog1->DefaultExt="XLS";  
              if   (SaveDialog1->Execute())  
                {  
                  try  
                    {  
                      Variant   MSExcel=CreateOleObject("Excel.Application");  
                      MSExcel.OlePropertyGet("WorkBooks").OleProcedure("Add");  
                      MSExcel.OlePropertySet("Visible",False);  
                      Muster->Account1->First();  
                      for   (int   i=1;i<=Muster->Account1->RecordCount;i++)  
                        {  
                          MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",i,1).OlePropertySet("NumberFormat","@");  
                          MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",i,1).OlePropertySet("Value",Muster->Account1->FieldByName("BANK")->AsString);  
                          MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",i,2).OlePropertySet("NumberFormat","0.00");  
                          MSExcel.OlePropertyGet("ActiveWorkBook").OlePropertyGet("ActiveSheet").OlePropertyGet("Cells",i,2).OlePropertySet("Value",Muster->Account1->FieldByName("FACT")->AsFloat);  
                          Muster->Account1->Next();  
                        }  
                      MSExcel.OlePropertyGet("ActiveWorkBook").OleProcedure("SaveAs",SaveDialog1->FileName);  
                      MSExcel.OlePropertyGet("ActiveWorkBook").OleProcedure("Close");  
                    }  
                  catch(...)  
                    {  
                      Application->MessageBox("没有安装Microsoft   Excel办公软件!","系统信息",MB_OK+MB_ICONWARNING);  
                    }  
                }    
  Top

9 楼ccrun(老妖)(www.ccrun.com)回复于 2004-09-06 10:24:41 得分 10

没有发现你说的问题。  
  出错的提示是什么?看看是否因为有隐藏的Excel进程没有结束引起的。Top

10 楼BorlandXBuilder(Just An Ant)回复于 2004-09-06 21:07:53 得分 20

来晚啦!!!  
   
  刚写完一个读取EXCEL的程序,呵呵  
   
   
   
  #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.OlePropertyGet   ("WorkBooks").OleProcedure   ("Open",   "c:\\book1.xls");  
          Wb   =   Ex.OlePropertyGet   ("ActiveWorkBook");    
          Sh1   =   Wb.OlePropertyGet   ("ActiveSheet");  
          Edit1->Text   =   Sh1.OlePropertyGet("Cells",1,1).OlePropertyGet("Value");  
          for   (int   i   =   1;   i   <=   10;   i   ++)  
                  for   (int   j   =   1;   j   <=   10;   j   ++)  
                          Sh1.OlePropertyGet   ("Cells",i,j).OlePropertySet   ("Value",i*100+j);  
           
          Wb.OleProcedure("Save");    
          Wb.OleProcedure("Close");  
  }Top

相关问题

  • OLE 控制 Excel 单元格的问题
  • 用ole实现一个excel的合并单元格的方法 ?
  • EXcel单元格属性
  • Excel模板,其中的单元格都定义了变量名,如何用代码给它付值
  • Excel模板,其中的单元格都定义了变量名,如何用代码给它付值
  • vb,excel,设置单元格格式
  • Excel中单元格引用问题
  • Excel问题,关于单元格尺寸
  • excel单元格格式问题
  • 如何合并Excel单元格(急)

关键词

  • excel
  • application
  • olepropertyget
  • msexcel
  • olepropertyset
  • oleprocedure
  • activeworkbook
  • activesheet
  • muster
  • workbooks

得分解答快速导航

  • 帖主:xcling00
  • zihan
  • quickreport
  • quickreport
  • yuyulily
  • ccrun
  • BorlandXBuilder

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo