您的位置:首页 > 其它

C设置Excel格式(OLE/COM)

2017-06-02 14:04 134 查看
原文链接:http://blog.sina.com.cn/s/blog_71265dc90101b55h.html

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/handsing/archive/2010/04/08/5461070.aspx

 

 最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要报给其他单位)。所以查阅了一下相关的VC的Excel编程操作,总结一下吧:(所有资料来源于网络)

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

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

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

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

一、Excel的对象模型

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

 

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

其中:

      Application:代表应用程序本身。即Excel应用程序

      Workbooks:是Workbook 的集合,代表了工作薄。

      Worksheets:是Worksheet的集合,是Workbook的子对象。

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

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

二、VC操作Excel的初始化过程

 1、导入Excel库文件。

     首先打开Class Wizard,点击"Add class"按钮下的"From a type Library"导入office安装目录下的"excel.exe"(适用于   Excel2003),然后选择需要用的一些类,比如_Application, _Workbook,Workbooks,   Worksheets,_Wroksheet,Range,Shapes等。点击确定后,系统会在你的程序目录下生成excel.h和excel.cpp两个文件,在要使用这些导入的类时加入#include"Excel.h"即可。

    2、初始化Application。

    首先, 初始化COM组件

view plaincopy to clipboardprint?

if(!AfxOleInit())  

{  

  AfxMessageBox("无法初始化COM的动态连接库");  

   returnFALSE;  



if(!AfxOleInit())

{

  AfxMessageBox("无法初始化COM的动态连接库");

   return FALSE;

}

 

   然后,创建Excel 服务器(启动Excel)

   定义app的全局或成员变量 _Applicationapp;

view plaincopy to clipboardprint?

if(!app.CreateDispatch("Excel.Application"))  

{  

  AfxMessageBox("无法启动Excel服务器");  

   returnFALSE;  



if (!app.CreateDispatch("Excel.Application"))

{

  AfxMessageBox("无法启动Excel服务器");

   return FALSE;

}

 

3、设置Excel的状态

view plaincopy to clipboardprint?

app.SetVisible(bVisble); //使Excel可见  

app.SetUserControl(bControl); //允许其他用户控制Excel 

app.SetVisible(bVisble); // 使Excel可见

app.SetUserControl(bControl); // 允许其他用户控制Excel

 

 

三、VC对Excel的操作

      定义变量

    view plaincopy to clipboardprint?

Workbooks books;  

_Workbook book;  

Worksheets sheets;  

_Worksheet sheet;  

LPDISPATCH lpDisp;  

Range  range;  

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); 

     Workbooks  books;

     _Workbook  book;

     Worksheets  sheets;

     _Worksheet  sheet;

     LPDISPATCH  lpDisp;

     Range   range;

     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

     

  1、打开已有的Excel文件

           view plaincopy to clipboardprint?

   books.AttachDispatch(app.GetWorkbooks());  

   //或者也可以  

   // books =app.GetWorkbooks();  

  lpDisp = books.Open("D:////1.xls", covOptional,covOptional, covOptional,   covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional,  

covOptional, covOptional, covOptional,covOptional); 

     books.AttachDispatch(app.GetWorkbooks());

    // 或者也可以

    // books = app.GetWorkbooks();

    lpDisp =books.Open("D:////1.xls", covOptional,covOptional, covOptional,   covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional,

  covOptional, covOptional, covOptional,covOptional);

                         

 

   

 2.、 新建一个.xls文件,并写入数据

      COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

       // Get the Workbooks collection so that you can add a newworkbook

           books.AttachDispatch(app.GetWorkbooks());  //得到Workbooks

       book =books.Add(covOptional);    // 得到Workbook

 

     // Get the Worksheets collection so that you can get the IDispatchfor the first Worksheet

      sheets =book.GetWorksheets();    // 得到Worksheets

      sheet = sheets.GetItem(COleVariant((short)1)); // 得到Worksheet

       

      // 分别向每个单元格添加数据

      // Excel2000 用函数SetValue()即可, Excel2003用函数SetValue2()

     //

     range  = sheet.GetRange(COleVariant("A1"),covOptional);  // 获取A1 Range

     range.SetValue2(COleVariant("Date"));                              // 添加数据

 

    range = sheet.GetRange(COleVariant("B1"),covOptional);   // 获取B1Range

    range.SetValue2(COleVariant("Order"));                              // 添加数据

    range = sheet.GetRange(COleVariant("C1"),covOptional);   // 获取C1Range

    range.SetValue2(COleVariant("Amount"));                           // 添加数据

    range = sheet.GetRange(COleVariant("D1"),covOptional);   // 获取D1Range

    range.SetValue2(COleVariant("Tax"));                                  //
添加数据

   

      // 向单元格中添加公式

    range =sheet.GetRange(COleVariant("D2"),covOptional);     // 获得D2 Range

    range =range.GetResize(COleVariant((long)NUMROWS), COleVariant((long)1));// 重新设置D2的大小

   range.SetFormula(COleVariant("=C2*0.07"));                        // 给D2:D21设置公式

     // 设置单元格的格式

     range = sheet.GetRange(COleVariant("A1"), COleVariant("D1")); //获得A1:D1的Range

     oFont =range.GetFont();                                                             //
获得Range的字体

     oFont.SetBold(COleVariant((short)TRUE));                                   //
设置是否粗体

     oFont.SetColor(COleVariant((long)RGB(255, 0,0)));                    // 设置字体颜色

     oFont.SetName(COleVariant("黑体"));                                          //
设置字体类型

     range =range.GetEntireColumn();                                               //
获得全部的单元格

     range.AutoFit();                                                                           //
自动适合尺寸

3、 合并单元格

     // 思路:1.先获取A1:C1的Range范围,然后重新定义此范围,最后合并

     //         2.直接获得A1:C2的Range范围,直接合并。结果和第一种方法一样

       Range unionRange;

      unionRange = sheet.GetRange(COleVariant("A1"),COleVariant("C1"));

      vResult = unionRange.GetMergeCells();

       unionRange = unionRange.GetResize(COleVariant((long)2),COleVariant((long)3));

       unionRange.Merge(COleVariant((long)0));     //合并单元格

       unionRange.SetRowHeight(COleVariant((short)30));  //设置单元格的高度

       unionRange.SetHorizontalAlignment(COleVariant((long)-4108));//水平居中对齐   

4、向单元格中插入图片(支持BMP、JPG格式,其他没试)

   Shapes  shapes  =  sheet.GetShapes();      //从Sheet对象上获得一个Shapes   

   range   =sheet.GetRange(COleVariant("B16"),COleVariant("J22"));   // 获得Range对象,用来插入图片

       

   rgMyRge1 = range;

  shapes.AddPicture("D://Test1.jpg"  ,  false  ,  true  ,  

                                 (float)range .GetLeft().dblVal, (float)range.GetTop().dblVal,    //
从本地添加一个图片

                                 (float)range .GetWidth().dblVal, (float)range.GetHeight().dblVal);

  ShapeRange  sRange  =  shapes.GetRange(_variant_t(long(1)));

  sRange.SetHeight(float(30));  

  sRange.SetWidth(float(30));  

5、将已建的.xls文件另存为

   COleVarian
bbde
t covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

   book.SaveAs(COleVariant("D://3.xls"),covOptional,covOptional,

                               covOptional,covOptional,covOptional,0,

                               covOptional,covOptional,covOptional,covOptional,covOptional); 

6、关闭Excel服务

   COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

   book.SetSaved(TRUE);    // 将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存

   range.ReleaseDispatch();   // 释放Range对象

   sheet.ReleaseDispatch();   // 释放Sheet对象

   sheets.ReleaseDispatch();   // 释放Sheets对象

 

   book.ReleaseDispatch();    // 释放Workbook对象

   books.ReleaseDispatch();   // 释放Workbooks对象

   book.Close (covOptional, covOptional,covOptional);//关闭Workbook对象

   books.Close();          // 关闭Workbooks对象

   

   app.Quit();         // 退出_Application

   app.ReleaseDispatch();      // 释放_Application

先写这么多吧,以后再添加
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel c