zoukankan      html  css  js  c++  java
  • VC++ operate excel

    利用VC操作Excel的方法至少有两种

    1 .利用ODBC把Excel文件当成数据库文件,来进行读、写、修改等操作,网上有人编写了CSpreadSheet类,提供支持

    2. 利用Automation(OLD Automation)方法。将Excel当成组件服务器,利用VBA。又分为基于MFC的和SDK两种。

    主要研究了一下第二种基于MFC的OLE编程方法。

    一、Excel的对象模型

        在对Excel编程之前首先要了解微软Excel 对象(Object)模型。(Parent-Child关系) 

    Office 应用程序对象模型

                     图 1 Office 应用程序对象模型(Excel)From msdn

    其中:

           _application:代表应用程序本身,即Excel应用程序。 EXCEL服务器

           Workbooks:  表示整个Excel服务器(表现为一个.xls文件)里所有的表,(可以通过"新建"得到多个表,即MDI程序里的一个视窗一样,所  有的视窗就是workbooks)

      _workbook:  就是一个表,相当于MDI中的一个视窗

           Worksheets:  表示所有的表单,每个表都可能有很多表单(sheet1,sheet2)

       _worksheet:  就表示一个表单

           Range:是Worksheet的子对象,可以理解为Sheet中一定范围的单元格。

           Shapes:是Worksheet的子对象,用于存储图片等信息的单元格。

    ___1,建立OLE自动化工程

    1,建立一个MFC AppWizard(exe)工程,TestExcel。导入excel 库文件,从classwizard中add class处from type library,去office的安装目录下( C:Program Files1Microsoft OfficeOFFICE11)引入excel.exe这是office 2003的选择,其他版本都是用olb文件),服务器就算引入了,这时会弹出对话框,要求加入一些类,这些类都是一些接口,里面有大量的方法,类的对象表征着excel文件的一个个部分,常用的有这几个_application,workbooks,_workbook,worksheets,_worksheet,Range .之后会出现excel.h,excel.cpp两个文件

    2,在excel.h文件中添加引用重复判断

    打开stdafx.h头文件确保包含如下头文件:

    #include <afxdisp.h>

    #include "excel.h" 

    3,// 在程序开始或APP初始化的时候初始化COM库
    打开testexcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:
    BOOL CTestExcelApp::InitInstance()
    {
         if( !AfxOleInit() ){
              AfxMessageBox("初始化Ole出错!");
              return FALSE;
         }
         AfxEnableControlContainer();
        ......
        ......
         return FALSE;
    }
    

     ____2操作excel文件

    1,新建一个excel,在一个按键或菜单命令中添加代码

        //create an application object,as excel application interface
        _Application app;
        //workbooks->workbook->worksheets->worksheet->range
        Workbooks books;
        _Workbook book;
        Worksheets sheets;
        _Worksheet sheet;
        //cell opeartion requir range object
        Range range;
        Font font;
        Range cols;
        //class of COleVariant  is packup of the date type of VARIANT, which normally used
        //in parameter transmission.In below codes,all parameters are converted by COleVariant class
      //Common OLE variants. These are easy variants to use for calling arguments.
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

      // Start Excel and get the Application object.
       if(!app.CreateDispatch("Excel.Application"))
       {
           AfxMessageBox("Couldn't start Excel and get an application 0bject");
           return;
        }
    //get workbooks
        books = app.GetWorkbooks();    
        //add one book
        book = books.Add(covOptional);
        //get sheet
        sheets = book.GetSheets();
        //get the firat sheet
        sheet = sheets.GetItem(COleVariant((short)1));
        //select in the sheet the aree of A1:A1
        range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));
        //set A1 = hello excel
        range.SetValue2(COleVariant("Hello excel,it is rainy today"));
        //change font,set bold
        font = range.GetFont();
        font.SetBold(COleVariant((short)TRUE));
        //select A2,insert a formula,and set to currency format
        range = sheet.GetRange(COleVariant("A2"),COleVariant("A2"));
        range.SetFormula(COleVariant("=RAND()*100000"));
        range.SetNumberFormat(COleVariant("$0.00"));
        //select A:A list, set auto fit 
        cols = range.GetEntireColumn();
        cols.AutoFit();
        //display excel,set status to user control
        app.SetVisible(TRUE);
        app.SetUserControl(TRUE);  //允许其他用户控制excel,否则excel将一闪而过。

    2,自动保存生成的excel文件

      book.SaveAs(COleVariant("C:\a.xls"),covOptional,
      covOptional,covOptional,
      covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,
      covOptional);

     3,上面的程序只能实现新建Excel文件的功能,但大多数情况我们需要的是导入excel中的数据,即要打开现存的xls文件,那么可用如下代码:

    CString sPath;// excel的绝对路径
    _Application app; Workbooks books; _Workbook book; Worksheets sheets; _Worksheet sheet; LPDISPATCH lpDisp;
    //接口指针 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    if( !app.CreateDispatch("Excel.Application") ){ this->MessageBox("无法创建Excel应用!"); return; }
    sPath = "D:\table.xls"; books
    =app.GetWorkbooks();
    //workbooks::open take 15 parameters! lpDisp
    = books.Open(sPath,covOptional,covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional ); book.AttachDispatch( lpDisp ); sheets=book.GetSheets(); sheet=sheets.GetItem(COleVariant((short)1)); range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));
    //将variant数据类型转换为CString类。 COleVariant rValue; rValue
    =COleVariant(range.GetValue2()); //getvalue2 take no parameter rValue.ChangeType(VT_BSTR); this->MessageBox(CString(rValue.bstrVal)); book.SetSaved(TRUE); app.Quit();

     4, 修改第N行第M列单元格颜色(参数color)

    Interior it; // 用于修改单元格颜色等属性


    range.AttachDispatch((range.GetItem (_variant_t(long(N)), _variant(long(M)))).pdispVal);
    it = range.GetInterior();
    it.SetColor(color);
    it.DetachDispatch();
    range.AttachDispatch(wht.GetCells());

     

      

     

  • 相关阅读:
    漏洞都是怎么编号的CVE/CAN/BUGTRAQ/CNCVE/CNVD/CNNVD
    数据集成之主数据管理(一)基础概念篇
    hdu 4940 Destroy Transportation system(水过)
    关于C++ const 的全面总结
    UserManageSys
    malloc函数具体解释
    Haskell 差点儿无痛苦上手指南
    机房收费系统——附加数据库
    面向对象程序设计与面向过程程序设计解析
    java的System.getProperty()方法能够获取的值
  • 原文地址:https://www.cnblogs.com/aprilapril/p/3314297.html
Copyright © 2011-2022 走看看