C++操作Excel说明

来源:互联网 发布:欧特克软件qq群 编辑:程序博客网 时间:2024/04/30 17:19
        Workbooks wbsMyBooks;         _Workbook wbMyBook;        Worksheets wssMysheets;         _Worksheet wssMysheet;        Range range;         Range iCell;        LPDISPATCH lpDisp;        COleVariant vResult;        COleVariant covTrue((short)TRUE), covFalse((short)FALSE),       covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//创建Excel 2000服务器(启动Excel),尽量在初始化中建立excel_app对象//以确保一次只打开一个excel服务器
//     if(!m_ExcelApp.CreateDispatch("Excel.Application")) //     {//         AfxMessageBox("无法启动Excel服务器!");//         return;//     }
  //app.SetVisible(TRUE);           //使Excel可见    //ExcelApp.SetUserControl(TRUE);       //允许其它用户控制Excel
    //打开c:\\*.xls    wbsMyBooks.AttachDispatch(m_ExcelApp.GetWorkbooks());    lpDisp = wbsMyBooks.Open(m_strPath,//此处无法打开文档没有问题
     covOptional, covOptional, covOptional, covOptional, covOptional,        covOptional, covOptional, covOptional, covOptional, covOptional,        covOptional, covOptional);    wbMyBook.AttachDispatch(lpDisp);//得到Workbook    wssMysheets.AttachDispatch(wbMyBook.GetWorksheets());//得到Worksheets
 //得到当前活跃sheet,如果有单元格正处于编辑状态中,此操作不能返回,会一直等待    lpDisp = wbMyBook.GetActiveSheet();    wssMysheet.AttachDispatch(lpDisp);
 //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列    Range usedRange;    usedRange.AttachDispatch(wssMysheet.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开始    //读取第iStartRow行,第iStartCol列单元格的值
 range.AttachDispatch(wssMysheet.GetCells());    range.AttachDispatch(range.GetItem(COleVariant(iStartRow),COleVariant(iStartCol)).pdispVal);    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(wssMysheet.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(long(1)),COleVariant(long(1)),COleVariant("HI,EXCEL!"));    //设置第一个单元格字体颜色:红色//     CFont font;//     range.AttachDispatch(wssMysheet.GetCells());//     range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);//     font(COleVariant((long)0xFF0000));    //合并单元格的处理,包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并    Range unionRange;    range.AttachDispatch(wssMysheet.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(wssMysheet.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));    //合并单元格    }    //将文件保存为*.xls    m_ExcelApp.SetVisible(TRUE);    CString strtmp = m_strPath.Left(m_strPath.ReverseFind('.')) + ".xls";//这里应该确保strtmp为有效路径,否则的话该函数会自己处理异常,导致以后的语句没有执行,没有关闭打开的文档    wbMyBook.SaveAs(COleVariant(strtmp),covOptional,covOptional,        covOptional,covOptional,covOptional,0,        covOptional,covOptional,covOptional,covOptional);    //关闭所有的book,退出Excel    wbMyBook.Close(covOptional, COleVariant(""), covOptional);    wbsMyBooks.Close();    //m_ExcelApp.Quit();
原创粉丝点击