• com口操作excel


    1. _Application app;       //Excel应用程序接口  
    2. Workbooks books;        //工作薄集合  
    3. _Workbook book;     //工作薄  
    4. Worksheets sheets;      //工作表集合  
    5. _Worksheet sheet;       //工作表  
    6. Range range;            //Excel中针对单元格的操作都应先获取其对应的Range对象  
    7. Font font;  
    8. Range cols;  
    9. /* 
    10. COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用 
    11. VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant 
    12. 类来转换了的。 
    13. */  
    14. //covOptional 可选参数的VARIANT类型  
    15. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
    16.   
    17. if( !app.CreateDispatch(L"Excel.Application") ){  
    18.     this->MessageBox(L"无法创建Excel应用!");  
    19.     return;  
    20. }  
    21.   
    22. //获取工作薄集合  
    23. books=app.GetWorkbooks();  
    24. //添加一个工作薄  
    25. book=books.Add(covOptional);  
    26. //获取工作表集合  
    27. sheets=book.GetSheets();  
    28. //获取第一个工作表  
    29. sheet=sheets.GetItem(COleVariant((short)1));  
    30.   
    31.   
    32. range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格   
    33. range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型  
    34.   
    35. //合并单元格  
    36. //加载要合并的单元格   
    37. range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);   
    38. range.Merge(COleVariant((long)0));   
    39.   
    40.   
    41.   
    42. range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格   
    43. range.SetItem(COleVariant((long)1),COleVariant((long)1),COleVariant(_T("数学系研究生课程统计")));  //A1  
    44. range.SetItem(COleVariant((long)2),COleVariant((long)1),COleVariant(_T("课程名")));              //A2  
    45. range.SetItem(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("课时")));                //B2  


     

       函数 SetNumberFormat() 用于设置单元格的格式,但是首先我们必须知道所有格式的标记。

    文本类:
    1、@ 指定内容按文本显示,主要用于编码、手机号等用数字表示的文本。设定该格式后,可以保证导出excel时,此类文本不会被转成数字显示。

    数值类:
    1、 0.00 表示两位小数,例如3.10367显示为3.10
    2、 0.## 表示两位小数,当小数末位为0时,0将不显示。例如3.10显示为3.1
    3、 "#,##0.00 "表示两位小数,且显示千份位
    4、 #,##0.00;[Red]#,##0.00 表示负数红字 
    5、0.00;[Red]0.00;" " 表示负数红字,且数据为0时不显示
    6、0.00;[Red](0.00);" "表示正数时两位小数,负数时两位小数并显示红色,0时不显示。0.00;[Red](0.00)只是一个示例,可以为任意的数字格式串,后边再加上;" "(空格)即表示数据为0时不显示。

    日期类:
    1、 yyyy-m-d 
    2、 yyyy-MM-dd 
    3、 yyyy-MM-dd hh:mm:ss
    4、 yyyy年MM月dd日

    百分比:
    1、0% 
    2、0.00%

    详细请打开Excel2003,单元格右键,设置单元格格式,选一种格式,点自定义即可看到该格式的格式串;有的Excel格式串后有带”_”,在使用时,必须去掉。

    读取xls文件示例 :

     

           //变量定义

           _Application app;          //Excel应用程序接口

           Workbooks books;         //工作薄集合

           _Workbook book;          //工作薄

           Worksheets sheets;         //工作表集合

           _Worksheet sheet;          //工作表

           Range range;                 //Excel中针对单元格的操作都应先获取其对应的Range对象

           Font font;

           Range cols;

           Range iCell;

           LPDISPATCH lpDisp;   

           COleVariant vResult;

           COleVariant

                  covTrue((short)TRUE),

                  covFalse((short)FALSE),

                  covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 

     

     

        //初始化

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

                  this->MessageBox(L"无法创建Excel应用!");

                  return;

           }

           app.SetVisible(TRUE);     //可见

           app.SetUserControl(TRUE); //用户可控制

     

     

     

           //打开XLS文件

           books.AttachDispatch(app.GetWorkbooks());

           lpDisp = books.Open(L"d:\3.xls",     

                  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);

     

     

     //*****

     //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列

     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();               //已使用区域的起始行,从开始

     long iStartCol=usedRange.GetColumn();            //已使用区域的起始列,从开始

     

    //读取第一个单元格的值

     range.AttachDispatch(sheet.GetCells());

     range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

     

     vResult =range.GetValue();

     

     CString str;

     if(vResult.vt == VT_BSTR)       //字符串

     {

            str=vResult.bstrVal;

     }

     else if (vResult.vt==VT_R8)     //8字节的数字

     {

            str.Format(L"%f",vResult.dblVal);

     }

     else if(vResult.vt==VT_DATE)    //时间格式

     {

            SYSTEMTIME st;

            VariantTimeToSystemTime((long)&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;

      }

     

     }

     

    //设置第一个单元格字体颜色:红色

     

     range.AttachDispatch(sheet.GetCells());

     range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);

     

     font.AttachDispatch(range.GetFont());

     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();       //起始行,从开始

            long iUnionStartCol=unionRange.GetColumn();    //起始列,从开始

     

     }

     else if(vResult.boolVal==0)  

     {

            

            //不是合并的单元格

     }

     

            //将第一个单元格合并成行,列

            range.AttachDispatch(sheet.GetCells());

            unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); //第一个单元格

            unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)3),COleVariant((long)2)));     //GetResize(3,2) 从第一个单元格开始合并行列的所有单元格

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

     

     

    //将文件保存为.xls

     book.SaveAs(COleVariant(L"C:\2.xls"),covOptional,covOptional,

            covOptional,covOptional,covOptional,0,

            covOptional,covOptional,covOptional,covOptional); 

     

    book.Close (covOptional,COleVariant(L"d:\3.xls"),covOptional);

     books.Close();

           //释放对象(相当重要!)

           range.ReleaseDispatch();

           cols.ReleaseDispatch();

           sheet.ReleaseDispatch();

           sheets.ReleaseDispatch();

           book.ReleaseDispatch();

           books.ReleaseDispatch();

           //App一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错

           app.ReleaseDispatch();

           app.Quit();

     

     



    选择篇

    1 选择单元格

     

    //选择一个单元格

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

     

    //选择多个单元格

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

     

    //使用变量表示单元格

    CString CellName;

    Int i=1;j=1;

    CellName.Format(_T(“%c%d”),j+64,i);   //A–Z  65-90

     

     

    //加载单元格

    rnge.AttachDispatch(range.GetRange(COleVariant(CellName),COleVariant(CellName)));

    2 选择某行

     

    1)

    //选择第一行

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV1"))),TRUE);

     

    //选择前5行

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV5"))),TRUE);

     

    2)先选择某行中的某个单元格,然后再选择整行

           Range rows;

     

           rows.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

           rows=rows.GetEntireRow();

     

    3)获得所有的行,然后再选择指定行

        Range rows;

     

           range.AttachDispatch(sheet.GetRows(),TRUE);

           //选择第一行

           rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

           rows.SetRowHeight(COleVariant((long)60));

     

    3 选择某一列

     

    1)

    range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A65536")));   //第一列

     

    2)先选择某列中的某个单元格,然后再选择整列

     

    range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1")));   //第一列

    range=range.GetEntireColumn();

     

    3)先获得所有列,然后再选择某一列

    //获得所有列

    range.AttachDispatch(sheet.GetColumns(),true);

    //选择第一列

    range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

     

    4 选择全部CELLS

     

    range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

     

    5 选择已使用的单元格

    range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

     

    6 获取单元格的值

    1)

    range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

    COleVariant rValue;
    rValue=COleVariant(range.GetValue());
    rValue.ChangeType(VT_BSTR);
    this->MessageBox(CString(rValue.bstrVal));

     

    2)

     

    //读取第一个单元格的值

     range.AttachDispatch(sheet.GetCells());

     range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

     

     vResult =range.GetValue();

     

     CString str;

     if(vResult.vt == VT_BSTR)       //字符串

     {

            str=vResult.bstrVal;

     }

     else if (vResult.vt==VT_R8)     //8字节的数字

     {

            str.Format(L"%f",vResult.dblVal);

     }

     else if(vResult.vt==VT_DATE)    //时间格式

     {

            SYSTEMTIME st;

            VariantTimeToSystemTime((long)&vResult.date, &st);

     }

     else if(vResult.vt==VT_EMPTY)   //单元格空的

     {

            str="";

     } 

    选择篇

    1 选择单元格

     

    //选择一个单元格

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

     

    //选择多个单元格

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

     

    //使用变量表示单元格

    CString CellName;

    Int i=1;j=1;

    CellName.Format(_T(“%c%d”),j+64,i);   //A–Z  65-90

     

     

    //加载单元格

    rnge.AttachDispatch(range.GetRange(COleVariant(CellName),COleVariant(CellName)));

    2 选择某行

     

    1)

    //选择第一行

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV1"))),TRUE);

     

    //选择前5行

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV5"))),TRUE);

     

    2)先选择某行中的某个单元格,然后再选择整行

           Range rows;

     

           rows.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

           rows=rows.GetEntireRow();

     

    3)获得所有的行,然后再选择指定行

        Range rows;

     

           range.AttachDispatch(sheet.GetRows(),TRUE);

           //选择第一行

           rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

           rows.SetRowHeight(COleVariant((long)60));

     

    3 选择某一列

     

    1)

    range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A65536")));   //第一列

     

    2)先选择某列中的某个单元格,然后再选择整列

     

    range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1")));   //第一列

    range=range.GetEntireColumn();

     

    3)先获得所有列,然后再选择某一列

    //获得所有列

    range.AttachDispatch(sheet.GetColumns(),true);

    //选择第一列

    range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

     

    4 选择全部CELLS

     

    range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

     

    5 选择已使用的单元格

    range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

     

    6 获取单元格的值

    1)

    range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

    COleVariant rValue;
    rValue=COleVariant(range.GetValue());
    rValue.ChangeType(VT_BSTR);
    this->MessageBox(CString(rValue.bstrVal));

     

    2)

     

    //读取第一个单元格的值

     range.AttachDispatch(sheet.GetCells());

     range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

     

     vResult =range.GetValue();

     

     CString str;

     if(vResult.vt == VT_BSTR)       //字符串

     {

            str=vResult.bstrVal;

     }

     else if (vResult.vt==VT_R8)     //8字节的数字

     {

            str.Format(L"%f",vResult.dblVal);

     }

     else if(vResult.vt==VT_DATE)    //时间格式

     {

            SYSTEMTIME st;

            VariantTimeToSystemTime((long)&vResult.date, &st);

     }

     else if(vResult.vt==VT_EMPTY)   //单元格空的

     {

            str="";

     } 




    设置篇

    1 设置单元格的值

     

    1)

    选中指定单元格,使用SetValue设置值

    CellName.Format(_T("A%d"),i);//单元格的名称

    range.AttachDispatch(sheet.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格range.SetValue(COleVariant(subFileName));

     

     

    CellName.Format(_T("C%d"),i);//单元格的名称

    range.AttachDispatch(sheet.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格

    range.SetValue(COleVariant((long)i));

     

    2)

    选中所有的单元格, 使用SetItem 设置指定单元格的值

     

    range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

    //设置第I行 第1、2、3列的值

    range.SetItem(COleVariant((long)(i)),COleVariant((long)1),COleVariant(subFileName)); //第一列

    range.SetItem(COleVariant((long)(i)),COleVariant((long)2),COleVariant(unicodeStr));  //第二列

    range.SetItem(COleVariant((long)(i)),COleVariant((long)3),COleVariant((long)i));      //第三列

     

    2 设置行高列宽

     

    选中某列 设置列宽

    //获得所有列

    range.AttachDispatch(sheet.GetColumns(),true);

    //设置第一列的列宽  Range cols

    cols.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

    cols.SetColumnWidth(COleVariant((long)10)); //设置列宽

     

    //设置第4列的列宽

    cols.AttachDispatch(range.GetItem(COleVariant((long)4),vtMissing).pdispVal,TRUE);

    cols.SetColumnWidth(COleVariant((long)10)); //设置列宽

     

     

     

    //设置列宽为自动适应

    cols.AutoFit();

     

    设置行高

     

     

        Range rows;

     

           range.AttachDispatch(sheet.GetRows(),TRUE);

           //选择第一行

           rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

    //设置行高

           rows.SetRowHeight(COleVariant((long)60));

     

    注意: 行高列宽使用的单位不一样 

     

    3 设置单元格类型

     

           range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

           range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型

     

    4 设置单元格字体

     

           Font ft;

     

           //设置第一列的字体

           range.AttachDispatch(sheet.GetColumns(),true);

           range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

          

           //字体作用范围

           ft.AttachDispatch(range.GetFont());

           ft.SetName(COleVariant(_T("宋体")));

           ft.SetSize(COleVariant((long)48));

    ft.SetBold(COleVariant((long)1));//粗体

    ft.SetColorIndex(COleVariant((long)2));//设置字体颜色

     

     

    5 设置单元格背景色

     

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))));

           //////////////设置底色/////////////////

           Interior it;

           it.AttachDispatch(range.GetInterior());

           it.SetColorIndex(COleVariant((long)11));//标题底色

     

           ////表格内容的底色////

           range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

           it.AttachDispatch(range.GetInterior());

           it.SetColorIndex(COleVariant((long)15));

     

    6 设置表格边框

     

    1)

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

    //LineStyle=线型Weight=线宽ColorIndex=线的颜色(-4105为自动)

    range.BorderAround(COleVariant((long)1),(long)2,((long)-4105),vtMissing);//设置边框

     

    2)

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

                         _variant_t v1;  //线型

                         _variant_t v2;  //宽度

                         _variant_t v3;  //颜色

     

                         v1.vt=VT_I2;

                         v1.lVal=2; // 线的样式:- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot; 

     

                         v2.vt=v1.vt;

                         v2.lVal=3; // 线的粗细程度

     

                         v3.vt=v1.vt;

                         v3.lVal=1; // 1-black;2-white;3-red;4-green;5-blue; 6-yellow; 7-pink;8-dark blue; 

     

                         UnitRge.BorderAround(v1,v2,v3,vtMissing);//设置边框

    7 合并单元格

     

    1)

           //合并单元格

           //加载要合并的单元格

           range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

           range.Merge(COleVariant((long)0));

     

    2)

            //将第一个单元格合并成行,列

            range.AttachDispatch(sheet.GetCells());

            unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); //第一个单元格

            unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)3),COleVariant((long)2)));     //GetResize(3,2) 从第一个单元格开始合并行列的所有单元格

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

    8 设置单元格文本为自动换行 及排列方式

     

           range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

           range.SetWrapText(COleVariant((long)1));//设置单元格内的文本为自动换行

     

           //设置齐方式为水平垂直居中

           //水平对齐:默认=1,居中=-4108,左=-4131,右=-4152

           //垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107

           range.SetHorizontalAlignment(COleVariant((long)-4108));

           range.SetVerticalAlignment(COleVariant((long)-4108));

    9 在单元格中插入公式

          

    //选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形式

    range=sheet.GetRange(COleVariant(L"A2"),COleVariant(L"A2"));

    range.SetFormula(COleVariant(L"=RAND()*100000"));

    range.SetNumberFormat(COleVariant(L"$0.00"));

     

    10 在单元格中插入图片

     

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

           range.AttachDispatch(sheet.GetRange(COleVariant(L"E5"),COleVariant(L"E5"))); // 获得Range对象,用来插入图片

           shapes.AddPicture( L"d:\pic.bmp "   ,   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));  //在RANGE范围内 设置图片宽高 
       sRange.SetWidth(float(30)); 

    11 对选取的区域进行排序

     

           #define xlAscending (long) 1

           #define xlDescending (long) 2

           #define vOpt COleVariant((long) DISP_E_PARAMNOTFOUND, VT_ERROR)

           #define xlHeader (long) 1                            // 选取的区域有标题

           #define xlNoHeader (long) 2                          // 选取的区域无标题    一定要正确确定是否有标题,否则排序可能不成功

           #define xlMatchCase COleVariant((long) 1)

           #define xlIgnoreCase COleVariant((long) 0)

           #define xlTopToBottom (long) 1                       // 垂直方向进行排序

           #define xlLeftToRight (long) 2                       // 水平方向进行排序

           #define xlPinYin (long) 1 // this is the default     // 按字符的中文拼音进行排序

           #define xlStroke (long) 2                            // 按每个字符中的笔画数进行排序

     

           VARIANT key1; // these lines set up first arg (key1) to sort

           V_VT(&key1) = VT_DISPATCH;                           // 排序时,关键字的vt设置为VT_DISPATCH

           V_DISPATCH(&key1) = sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1"));   // 设置按哪个关键字进行排序 选择单元意为:按此列(或行)为主关键字进行排序

           range=sheet.GetRange(COleVariant(L"A1"),COleVariant(CellName));              // 选择对哪些区域内的单元格进行排序

           range.Sort(key1, xlAscending, vOpt, vOpt, xlAscending, vOpt,xlAscending,xlNoHeader,vOpt,xlIgnoreCase,xlTopToBottom,xlPinYin); //设置排序 无标题时一定要设置为xlNoHeader  否则不起作用

    选择篇

    1 选择单元格

     

    //选择一个单元格

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

     

    //选择多个单元格

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

     

    //使用变量表示单元格

    CString CellName;

    Int i=1;j=1;

    CellName.Format(_T(“%c%d”),j+64,i);   //A–Z  65-90

     

     

    //加载单元格

    rnge.AttachDispatch(range.GetRange(COleVariant(CellName),COleVariant(CellName)));

    2 选择某行

     

    1)

    //选择第一行

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV1"))),TRUE);

     

    //选择前5行

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("IV5"))),TRUE);

     

    2)先选择某行中的某个单元格,然后再选择整行

           Range rows;

     

           rows.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("A1"))),TRUE);

           rows=rows.GetEntireRow();

     

    3)获得所有的行,然后再选择指定行

        Range rows;

     

           range.AttachDispatch(sheet.GetRows(),TRUE);

           //选择第一行

           rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

           rows.SetRowHeight(COleVariant((long)60));

     

    3 选择某一列

     

    1)

    range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A65536")));   //第一列

     

    2)先选择某列中的某个单元格,然后再选择整列

     

    range.AttachDispatch(sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1")));   //第一列

    range=range.GetEntireColumn();

     

    3)先获得所有列,然后再选择某一列

    //获得所有列

    range.AttachDispatch(sheet.GetColumns(),true);

    //选择第一列

    range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

     

    4 选择全部CELLS

     

    range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

     

    5 选择已使用的单元格

    range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

     

    6 获取单元格的值

    1)

    range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

    COleVariant rValue;
    rValue=COleVariant(range.GetValue());
    rValue.ChangeType(VT_BSTR);
    this->MessageBox(CString(rValue.bstrVal));

     

    2)

     

    //读取第一个单元格的值

     range.AttachDispatch(sheet.GetCells());

     range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );

     

     vResult =range.GetValue();

     

     CString str;

     if(vResult.vt == VT_BSTR)       //字符串

     {

            str=vResult.bstrVal;

     }

     else if (vResult.vt==VT_R8)     //8字节的数字

     {

            str.Format(L"%f",vResult.dblVal);

     }

     else if(vResult.vt==VT_DATE)    //时间格式

     {

            SYSTEMTIME st;

            VariantTimeToSystemTime((long)&vResult.date, &st);

     }

     else if(vResult.vt==VT_EMPTY)   //单元格空的

     {

            str="";

     } 


    设置篇

    1 设置单元格的值

     

    1)

    选中指定单元格,使用SetValue设置值

    CellName.Format(_T("A%d"),i);//单元格的名称

    range.AttachDispatch(sheet.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格range.SetValue(COleVariant(subFileName));

     

     

    CellName.Format(_T("C%d"),i);//单元格的名称

    range.AttachDispatch(sheet.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格

    range.SetValue(COleVariant((long)i));

     

    2)

    选中所有的单元格, 使用SetItem 设置指定单元格的值

     

    range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

    //设置第I行 第1、2、3列的值

    range.SetItem(COleVariant((long)(i)),COleVariant((long)1),COleVariant(subFileName)); //第一列

    range.SetItem(COleVariant((long)(i)),COleVariant((long)2),COleVariant(unicodeStr));  //第二列

    range.SetItem(COleVariant((long)(i)),COleVariant((long)3),COleVariant((long)i));      //第三列

     

    2 设置行高列宽

     

    选中某列 设置列宽

    //获得所有列

    range.AttachDispatch(sheet.GetColumns(),true);

    //设置第一列的列宽  Range cols

    cols.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

    cols.SetColumnWidth(COleVariant((long)10)); //设置列宽

     

    //设置第4列的列宽

    cols.AttachDispatch(range.GetItem(COleVariant((long)4),vtMissing).pdispVal,TRUE);

    cols.SetColumnWidth(COleVariant((long)10)); //设置列宽

     

     

     

    //设置列宽为自动适应

    cols.AutoFit();

     

    设置行高

     

     

        Range rows;

     

           range.AttachDispatch(sheet.GetRows(),TRUE);

           //选择第一行

           rows.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal);

    //设置行高

           rows.SetRowHeight(COleVariant((long)60));

     

    注意: 行高列宽使用的单位不一样 

     

    3 设置单元格类型

     

           range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格

           range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型

     

    4 设置单元格字体

     

           Font ft;

     

           //设置第一列的字体

           range.AttachDispatch(sheet.GetColumns(),true);

           range.AttachDispatch(range.GetItem(COleVariant((long)1),vtMissing).pdispVal,TRUE);

          

           //字体作用范围

           ft.AttachDispatch(range.GetFont());

           ft.SetName(COleVariant(_T("宋体")));

           ft.SetSize(COleVariant((long)48));

    ft.SetBold(COleVariant((long)1));//粗体

    ft.SetColorIndex(COleVariant((long)2));//设置字体颜色

     

     

    5 设置单元格背景色

     

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))));

           //////////////设置底色/////////////////

           Interior it;

           it.AttachDispatch(range.GetInterior());

           it.SetColorIndex(COleVariant((long)11));//标题底色

     

           ////表格内容的底色////

           range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

           it.AttachDispatch(range.GetInterior());

           it.SetColorIndex(COleVariant((long)15));

     

    6 设置表格边框

     

    1)

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

    //LineStyle=线型Weight=线宽ColorIndex=线的颜色(-4105为自动)

    range.BorderAround(COleVariant((long)1),(long)2,((long)-4105),vtMissing);//设置边框

     

    2)

    range.AttachDispatch(sheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));

                         _variant_t v1;  //线型

                         _variant_t v2;  //宽度

                         _variant_t v3;  //颜色

     

                         v1.vt=VT_I2;

                         v1.lVal=2; // 线的样式:- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot; 

     

                         v2.vt=v1.vt;

                         v2.lVal=3; // 线的粗细程度

     

                         v3.vt=v1.vt;

                         v3.lVal=1; // 1-black;2-white;3-red;4-green;5-blue; 6-yellow; 7-pink;8-dark blue; 

     

                         UnitRge.BorderAround(v1,v2,v3,vtMissing);//设置边框

    7 合并单元格

     

    1)

           //合并单元格

           //加载要合并的单元格

           range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);

           range.Merge(COleVariant((long)0));

     

    2)

            //将第一个单元格合并成行,列

            range.AttachDispatch(sheet.GetCells());

            unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal ); //第一个单元格

            unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)3),COleVariant((long)2)));     //GetResize(3,2) 从第一个单元格开始合并行列的所有单元格

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

    8 设置单元格文本为自动换行 及排列方式

     

           range.AttachDispatch(sheet.GetUsedRange());//加载已使用的单元格

           range.SetWrapText(COleVariant((long)1));//设置单元格内的文本为自动换行

     

           //设置齐方式为水平垂直居中

           //水平对齐:默认=1,居中=-4108,左=-4131,右=-4152

           //垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107

           range.SetHorizontalAlignment(COleVariant((long)-4108));

           range.SetVerticalAlignment(COleVariant((long)-4108));

    9 在单元格中插入公式

          

    //选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形式

    range=sheet.GetRange(COleVariant(L"A2"),COleVariant(L"A2"));

    range.SetFormula(COleVariant(L"=RAND()*100000"));

    range.SetNumberFormat(COleVariant(L"$0.00"));

     

    10 在单元格中插入图片

     

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

           range.AttachDispatch(sheet.GetRange(COleVariant(L"E5"),COleVariant(L"E5"))); // 获得Range对象,用来插入图片

           shapes.AddPicture( L"d:\pic.bmp "   ,   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));  //在RANGE范围内 设置图片宽高 
       sRange.SetWidth(float(30)); 

    11 对选取的区域进行排序

     

           #define xlAscending (long) 1

           #define xlDescending (long) 2

           #define vOpt COleVariant((long) DISP_E_PARAMNOTFOUND, VT_ERROR)

           #define xlHeader (long) 1                            // 选取的区域有标题

           #define xlNoHeader (long) 2                          // 选取的区域无标题    一定要正确确定是否有标题,否则排序可能不成功

           #define xlMatchCase COleVariant((long) 1)

           #define xlIgnoreCase COleVariant((long) 0)

           #define xlTopToBottom (long) 1                       // 垂直方向进行排序

           #define xlLeftToRight (long) 2                       // 水平方向进行排序

           #define xlPinYin (long) 1 // this is the default     // 按字符的中文拼音进行排序

           #define xlStroke (long) 2                            // 按每个字符中的笔画数进行排序

     

           VARIANT key1; // these lines set up first arg (key1) to sort

           V_VT(&key1) = VT_DISPATCH;                           // 排序时,关键字的vt设置为VT_DISPATCH

           V_DISPATCH(&key1) = sheet.GetRange(COleVariant(L"A1"),COleVariant(L"A1"));   // 设置按哪个关键字进行排序 选择单元意为:按此列(或行)为主关键字进行排序

           range=sheet.GetRange(COleVariant(L"A1"),COleVariant(CellName));              // 选择对哪些区域内的单元格进行排序

           range.Sort(key1, xlAscending, vOpt, vOpt, xlAscending, vOpt,xlAscending,xlNoHeader,vOpt,xlIgnoreCase,xlTopToBottom,xlPinYin); //设置排序 无标题时一定要设置为xlNoHeader  否则不起作用

  • 相关阅读:
    基于微软解决方案的负载测试实现知识库1____(转)理解.NET中的数据库连接池
    [转] Performance vs. load vs. stress testing _Grig Gheorghiu (翻译水平有限,如有错误请帮忙刊正)
    Bill Gates Centimillionaire and one poor man.
    VB Comwrapper 的实现
    使用接口作为返回值
    如何排查SQL死锁的错误?
    VC++动态链接库编程之DLL典型实例
    VC++动态链接库编程之DLL木马
    VC中获取窗口句柄的各种方法 .
    VC++动态链接库编程之MFC扩展 DLL
  • 原文地址:https://www.cnblogs.com/xzh1993/p/9467137.html
Copyright © 2020-2023  润新知