您的位置:首页 > 其它

在VC中彻底玩转Excel

2017-08-07 15:00 344 查看
作者:龚敏       来源:子玉山庄       更新:10/8/2004     
    
        如今Excel是越来越重要了,在我们自己开发的程序中不免要和Excel打交道了。利用Automation技术,我们可以在不去了解   
  数据库的情况下玩转Excel,而且你会发现一切竟如此轻松!   
          好了,咱们开始吧,我不喜欢用长篇累牍的代码来故弄玄虚,所以下面的代码都是切中要害的片段,总体上是个连贯的过程,   
  包括启动Excel,读取数据,写入数据,以及最后的关闭Excel,其中还包括了很多人感兴趣的合并单元格的处理。   
          特别说明以下代码需要MFC的支持,而且工程中还要包含EXCEL2000的定义文件:EXCEL9.H,EXCEL9.CPP   
//*****
//变量定义
_Application   app;
Workbooks   books;
_Workbook   book;
Worksheets   sheets;
_Worksheet   sheet;
Range   range;
Range   iCell;
LPDISPATCH   lpDisp;
COleVariant   vResult;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,   VT_ERROR);

//*****
//初始化COM的动态连接库
if(!AfxOleInit())
{
AfxMessageBox("无法初始化COM的动态连接库!");
return   ;
}

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

app.SetVisible(TRUE);                     //使Excel可见
app.SetUserControl(TRUE);             //允许其它用户控制Excel

//*****
//打开c:\\1.x
4000
ls
books.AttachDispatch(app.GetWorkbooks());
lpDisp   =   books.Open("C:\\\\1.xls",
covOptional,   covOptional,   covOptional,   covOptional,   covOptional,
covOptional,   covOptional,   covOptional,   covOptional,   covOptional,
covOptional,   covOptional   );

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

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

#include   "excel8.h"

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

//*****
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
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   );
COleVariant   vResult   =range.GetValue();
CString   str;
if(vResult.vt   ==   VT_BSTR)               //字符串
{
str=vResult.bstrVal;
}
else   if   (vResult.vt==VT_R8)           //8字节的数字
{
str.Format("%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;
}

}

//*****
//设置第一个单元格的值"HI,EXCEL!"
range.SetItem(COleVariant(1),COleVariant(1),COleVariant("HI,EXCEL!"));

//*****
//设置第一个单元格字体颜色:红色
Font   font;
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch((range.GetItem   (COleVariant(long(1)),   COleVariant(long(1)))).pdispVal);
font.SetColor(COleVariant((long)0xFF0000));

//*****
//合并单元格的处理
//包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并
Range   unionRange;
range.AttachDispatch(sheet.GetCells());
unionRange.AttachDispatch(range.GetItem   (COleVariant((long)1),COleVariant((long)1)).pdispVal   );

vResult=unionRange.GetMergeCells();
if(vResult.boolVal==-1)                           //是合并的单元格
{
//合并单元格的行数
range.AttachDispatch   (unionRange.GetRows   ());
long   iUnionRowNum=range.GetCount   ();

//合并单元格的列数
range.AttachDispatch   (unionRange.GetColumns   ());
long   iUnionColumnNum=range.GetCount   ();

//合并区域的起始行,列
long   iUnionStartRow=unionRange.GetRow();               //起始行,从1开始
long   iUnionStartCol=unionRange.GetColumn();         //起始列,从1开始

}
else   if(vResult.boolVal==0)
{//不是合并的单元格}

//将第一个单元格合并成2行,3列
range.AttachDispatch(sheet.GetCells());
unionRange.AttachDispatch(range.GetItem   (COleVariant((long)1),COleVariant((long)1)).pdispVal   );
unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)2),COleVariant((long)3)));
unionRange.Merge(COleVariant((long)0));       //合并单元格

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

//*****
//关闭所有的book,退出Excel
book.Close   (covOptional,COleVariant(OutFilename),covOptional);
books.Close();
app.Quit();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: