VC控制excel

VC控制excel

分类: IT | 标签:  excel    vc  
2010-07-07 13:59阅读( 528) 评论(0)

    目前用VC控制excel进行输出应该是没有问题了,读入部分程序通过,但是没有进行验证。

    这个是综合了网上的资源,在VS2005下调试通过的版本。

    

    第一步:在VC++6.0中进行。(在VS2005中会出现错误)

    导入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"即可。

    这一步在VS2005中实验会出现错误,网上说在VC++6.0中是OK的。

    在VC++6.0并没有实际操作,而是使用了网上下载的一个现成的资源,使用时直接把excel.h和excel.cpp加入工程即可。

    第二步:初始化。

 //初始化COM组件;但是这一步很奇怪,在自己的工程中会出现已近初始化的错误,去掉之后反而是好使了。
 if(!AfxOleInit())   
 {   
    AfxMessageBox(_T("无法初始化COM的动态连接库"));   
    return ;   
 }

 

 //创建Excel 服务器(启动Excel),定义app的全局或成员变量
 _Application app;//定义全局的excel服务器变量

 

 // 启动Excel 服务器
 if (!app.CreateDispatch(_T("Excel.Application")))   
 {   
    AfxMessageBox(_T("无法启动Excel服务器"));   
    return ;   
 }

  //设置Excel的状态
 app.SetVisible(TRUE); // 使Excel可见   
 app.SetUserControl(TRUE); // 允许其他用户控制Excel 

      

     第三步:编写相应操作代码。

 //VC对Excel的操作
 // 定义变量
 Workbooks  books;   
 _Workbook  book;   
 Worksheets  sheets;   
 _Worksheet  sheet;   
 LPDISPATCH  lpDisp;   
 Range   range;   
 Range iCell;
 Font font;
 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 


  //打开D:\\1.xls
 books.AttachDispatch(app.GetWorkbooks());
 lpDisp = books.Open(_T("D:\\1.xls"),      
 covOptional, covOptional, covOptional, covOptional, covOptional,
 covOptional, covOptional, covOptional, covOptional, covOptional,
 covOptional, covOptional,covOptional, covOptional );

 //*****
 //得到Workbook
 book.AttachDispatch(lpDisp);


 //*****
 //得到Worksheets 
 sheets.AttachDispatch(book.GetWorksheets());


 //*****
 //得到当前活跃sheet
 //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
 lpDisp=book.GetActiveSheet();
 sheet.AttachDispatch(lpDisp);

 // 分别向每个单元格添加数据
 // Excel2000 用函数SetValue()即可, Excel2003用函数SetValue2()

 range  = sheet.GetRange(COleVariant(_T("A1")), covOptional);  // 获取A1 Range
 range.SetValue2( COleVariant(_T("Date")));                               // 添加数据

 range = sheet.GetRange(COleVariant(_T("B1")), covOptional);   // 获取B1 Range
 range.SetValue2(COleVariant(_T("Order")));                               // 添加数据

 //还有另一种方法设置数据
 //设置第一个单元格的值"HI,EXCEL!",可以使用循环的方式来写数据
 range.SetItem(COleVariant(long(3)),COleVariant(long(1)),COleVariant(_T("HI,EXCEL!")));


 //合并单元格

 // 思路:1.先获取A1:C1的Range范围,然后重新定义此范围,最后合并
 //          2.直接获得A1:C2的Range范围,直接合并。结果和第一种方法一样
 Range unionRange;
 unionRange = sheet.GetRange(COleVariant(_T("A1")), COleVariant(_T("C1"))); 
 COleVariant  vResult = unionRange.GetMergeCells();
 unionRange = unionRange.GetResize(COleVariant((long)2), COleVariant((long)3));
 unionRange.Merge(COleVariant((long)0));      //合并单元格
 unionRange.SetRowHeight(COleVariant((short)30));   //设置单元格的高度
 range.SetColumnWidth(COleVariant((short)30));  //设置列宽为40
 unionRange.SetHorizontalAlignment(COleVariant((long)-4108));// 水平居中对齐


 // 向单元格中添加公式,excel会自动计算

 range = sheet.GetRange(COleVariant(_T("E3")), covOptional);      // 获得D2 Range
 range = range.GetResize(COleVariant((long)1), COleVariant((long)1)); // 重新设置D2的大小
 range.SetFormula(COleVariant(_T("=C2*0.07")));                         // 给D2:D21设置公式

 // 设置单元格的格式

 range = sheet.GetRange(COleVariant(_T("A1")), COleVariant(_T("D2"))); // 获得A1:D1的Range
 font = range.GetFont();                                                              // 获得Range的字体
 font.SetBold(COleVariant((short)TRUE));                                    // 设置是否粗体
 font.SetItalic(COleVariant((short)TRUE));                     //斜体
 font.SetColor(COleVariant((long)RGB(255, 255, 0)));                     // 设置字体颜色

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

 range = range.GetEntireColumn();                                                // 获得全部的单元格
 range.AutoFit();                                                                            // 自动适合尺寸
 font.DetachDispatch();                     //释放字体对象


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

 Shapes   shapes   =   sheet.GetShapes();       // 从Sheet对象上获得一个Shapes    
 range   = sheet.GetRange(COleVariant(_T("B16")),COleVariant(_T("J22")));    // 获得Range对象,用来插入图片

 //shapes.AddPicture(_T("D:\\test1.jpg")   ,   false   ,   true   ,   
 //       (float)range .GetLeft().dblVal, (float)range .GetTop().dblVal,     // 从本地添加一个图片
 //       (float)range .GetWidth().dblVal, (float)range .GetHeight().dblVal);
 //这种方法的图片根据range的大小缩放,产生形变,所以已知图片大小的情况下,用下面这种

 shapes.AddPicture(_T("D:\\test1.jpg")   ,   false   ,   true   ,   
      500, 500,     // 从本地添加一个图片
      100, 100);

 Shape m_oShape;
 m_oShape.AttachDispatch( shapes.GetRange( COleVariant((long)1) ), TRUE );
 //m_oShape.SetWidth(float(200));


 //*****
 //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
 Range usedRange;
 usedRange.AttachDispatch(sheet.GetUsedRange());
 range.AttachDispatch(usedRange.GetRows());
 long iRowNum=range.GetCount();                   //已经使用的行数

 range.AttachDispatch(usedRange.GetColumns());
 long iColNum=range.GetCount();                   //已经使用的列数

 long iStartRow=usedRange.GetRow();               //已使用区域的起始行,从1开始
 long iStartCol=usedRange.GetColumn();            //已使用区域的起始列,从1开始
  
  
 //*****
 //读取第一个单元格的值
 range.AttachDispatch(sheet.GetCells()); 
 range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );
 vResult =range.GetValue2();
 CString str;
 if(vResult.vt == VT_BSTR)       //字符串
 {
  str=vResult.bstrVal;
 }
 else if (vResult.vt==VT_R8)     //8字节的数字 
 {
  str.Format(_T("%f"),vResult.dblVal);
 }
 else if(vResult.vt==VT_DATE)    //时间格式
 {
  SYSTEMTIME st;
  VariantTimeToSystemTime(vResult.date, &st);
 }
 else if(vResult.vt==VT_EMPTY)   //单元格空的
 {
  str="";
 }  
 
 
 //*****
 //读取第一个单元格的对齐方式,数据类型:VT_I4
 //读取水平对齐方式
 range.AttachDispatch(sheet.GetCells());
 iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
 vResult.lVal=0;
 vResult=iCell.GetHorizontalAlignment();
 if(vResult.lVal!=0)
 {
  switch (vResult.lVal)
  {
  case 1:      //默认
   break;
  case -4108:  //居中
   break;
  case -4131 : //靠左
   break;
  case -4152 : //靠右
   break;
  }
 }
  
 //垂直对齐方式
 iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
 vResult.lVal=0;
 vResult=iCell.GetVerticalAlignment();
 if(vResult.lVal!=0)
 {
  switch (vResult.lVal)
  {
  case -4160 :  //靠上
   break;
  case -4108 :  //居中
   break;
  case -4107 :  //靠下
   break;
  }
 }

 


 //*****
 //将文件保存为2.xls 
 book.SaveAs(COleVariant(_T("D:\\2.xls")),
  covOptional,covOptional, covOptional,covOptional,covOptional,
  0,covOptional,covOptional,covOptional,covOptional,covOptional);

 //*****
 //关闭所有的book,退出Excel 
 //book.Close (covOptional,COleVariant(OutFilename),covOptional);
 //books.Close();      
 //app.Quit();  

 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值