excel之单元格格式/设置/

http://blog.csdn.net/shuilan0066/article/details/7925023


示例---将所有单元格设置为文本格式:

 

  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
yyyyMMdd

百分比:
1
0%
2
0.00%

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



设置篇

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="";

 

读取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、 在VC6.0里创建一个MFC工程

2、打开MFCClassWizard窗口(查看>建立类向导),选择Automation,单击AddClass按钮,选择Froma type library...,弹出文件选择对话框,之后定位到C:\Program Files\MicrosoftOffice\OFFICE11\EXCEL.EXE,在生成类中添加所有的对象(其实添加需要的即可,为了简便,不出错保留了冗余),如下图。



 
 

3 、返回编辑器,查看工程文件,可发现多了 EXCEL.9H EXCEL9.CPP 两个文件,拷贝出来,放在 VS2005 需要使用excel的工程文件中。

4. 打开stdafx.h头文件确保包含如下头文件:

#include <afxdisp.h>(这个一般有了)

#include "excel.h" (手动添加这个即可)

5. 打开TestExcel.cpp文件,修改CTestExcelApp::InitInstance(),加入如下代码:

if(!AfxOleInit() ){

AfxMessageBox("初始化Ole出错!");

return FALSE;

}

为保证编译时不产生重复定义错误(可以验证一下是否成功加载,没有也能正常执行),我编译时出现了很多“类重复定义”异常,打开excel.h文件,在文件开始位置加入如下代码:

#if !defined _HEAD_FILE_EXCEL9_

#define _HEAD_FILE_EXCEL9_

相应的,在文件末尾加入:

#endif

成功

Excel接口

导入类

头文件

说明

_Application

CApplicaton

Application.h

Excel应用程序。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,里面包括了Excel应用程序打开的所有工作簿

_Workbook

CWorkbook

Workbook.h

单个工作簿。

Worksheets

CWorksheets

Worksheets.h

单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet

_Worksheet

CWorksheet

Worksheet.h

单个Sheet表格。

Range

CRange

Range.h

一定数量的单元格,可对单元格进行单个或多个单元格进行操作

在MSDN中,很少有excel方面的资料,但是在http://msdn.microsoft.com/zh-cn/ms348103.aspx中可以找到C#控制EXCEL方面的说明

 

二、操作EXCEL文件

1. 新建一个excel表,并填充两个单元格的实例

  1. void CTestExcelDlg::OnButton1()  
  2. {  
  3. //Workbooks—>Workbook —>Worksheets—>Worksheet —>Range  
  4. _Application app;       //Excel应用程序接口  
  5. Workbooks books;        //工作薄集合  
  6. _Workbook book;     //工作薄  
  7. Worksheets sheets;      //工作表集合  
  8. _Worksheet sheet;       //工作表  
  9. Range range;            //Excel中针对单元格的操作都应先获取其对应的Range对象  
  10. Font font;  
  11. Range cols;  
  12. /* 
  13. COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用 
  14. VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant 
  15. 类来转换了的。 
  16. */  
  17. //covOptional 可选参数的VARIANT类型  
  18. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  19. if( !app.CreateDispatch("Excel.Application") ){  
  20. this->MessageBox("无法创建Excel应用!");  
  21. return;  
  22. }  
  23. //获取工作薄集合  
  24. books=app.GetWorkbooks();  
  25. //添加一个工作薄  
  26. book=books.Add(covOptional);  
  27. //获取工作表集合  
  28. sheets=book.GetSheets();  
  29. //获取第一个工作表  
  30. sheet=sheets.GetItem(COleVariant((short)1));  
  31. //选择工作表中A1:A1单元格区域  
  32. range=sheet.GetRange(COleVariant("A1"),COleVariant("A1"));  
  33. //设置A1=HELLO EXCEL!"  
  34. range.SetValue(COleVariant("HELLO EXCEL!"));  
  35. //调整格式,设置粗体  
  36. font=range.GetFont();  
  37. font.SetBold(COleVariant((short)TRUE));  
  38. //选择A2单元格,插入一个公式"=RAND()*100000",并设置A2数字格式为货币形  
  39. 式  
  40. range=sheet.GetRange(COleVariant("A2"),COleVariant("A2"));  
  41. range.SetFormula(COleVariant("=RAND()*100000"));  
  42. range.SetNumberFormat(COleVariant("$0.00"));  
  43. //选择A:A列,设置宽度为自动适应  
  44. cols=range.GetEntireColumn();  
  45. cols.AutoFit();  
  46. //显示Excel表格,并设置状态为用户可控制  
  47. app.SetVisible(TRUE);  
  48. app.SetUserControl(TRUE);  

2. 打开一个已有的excel表格实例

  1. CString strPath;   
  2. strPath += "C:\\template.xlt"// 模板的路径   
  3. CFileFind filefind;   
  4. if( !filefind.FindFile( strPath ) )   
  5. {   
  6. AfxMessageBox( "没有找到模版文档,请其查找" );   
  7.     return;  
  8. }   
  9. LPDISPATCH lpDisp;  //接口指针  
  10. books=app.GetWorkbooks();  
  11. lpDisp = books.Open(m_filepath,  
  12.     covOptional, covOptional, covOptional, covOptional,  
  13.     covOptional, covOptional, covOptional, covOptional,  
  14.     covOptional, covOptional, covOptional, covOptional,  
  15.     covOptional, covOptional  
  16.     );                  //与的不同,是个参数的,直接在后面加了两个covOptional成功了  
  17. book.AttachDispatch(lpDisp);  

3. 保存一个excel文件实例


  1. book.SetSaved(TRUE);  

4. 另存一个excel文件实例

  1. book.SaveAs(COleVariant(m_filename),covOptional,  
  2.     covOptional,covOptional,  
  3.     covOptional,covOptional,(long)0,  
  4. covOptional,covOptional,covOptional,  
  5. covOptional,covOptional); //与的不同,是个参数的,直接在后面加了两个covOptional成功了  

5. 释放一个excel文件实例

经试验证实,不释放第二次使用excel时会中断,放在类的析构里面有时调用不到,主动调用最保险。(有没有AttachDispatch()过都要释放,否则报错

  1. //释放对象(相当重要!)   
  2. Rang.ReleaseDispatch();   
  3. sheet.ReleaseDispatch();   
  4. sheets.ReleaseDispatch();   
  5. book.ReleaseDispatch();   
  6. books.ReleaseDispatch();   
  7. //退出程序   
  8. app.Quit();  
  9. //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错   
  10. app.ReleaseDispatch();   

6. 修改一个excel单元格

  1. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  2. range.SetValue2(COleVariant(value));  

7. 取出一个excel单元格

实现Variant数据类型转换为CString类,这个只是一个示例,转换较为简单。

  1. range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  2. COleVariant rValue;  
  3. rValue=COleVariant(range.GetValue2());  
  4. rValue.ChangeType(VT_BSTR);  
  5. return CString(rValue.bstrVal);  

8. 还有释放问题是最重要的问题:

   首先变量必须全释放,无论当初是否绑定过;

   其次,程序释放和程序关闭的顺序必须是

  1. app.Quit();  
  2. app.ReleaseDispatch();  
  3. 如果顺如颠倒如下:  
  4. app.ReleaseDispatch();  
  5. app.Quit();  
  6. 出现的后果是程序关闭后,excel进程仍然运行,所以无法正常打开程序曾经打开excel表格。  

附录(操作类源码):

  1. #include "../Stdafx.h"  
  2. #include "OptExcel.h"  
  3. #include "excel.h"  
  4. #include "comdef.h"  
  5.          
  6.   
  7. _Application app;  
  8. Workbooks books;  
  9. _Workbook book;  
  10. Worksheets sheets;  
  11. _Worksheet sheet;  
  12. Range range;  
  13. Range cell;  
  14. Font font;  
  15.   
  16. COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
  17.   
  18.   
  19.   
  20. ///Function:    COptExcel  
  21. ///Description: 初始化函数,初始化中附加excel应用程序  
  22. ///Call:        app.CreateDispatch(_T("Excel.Application")  
  23.   
  24. COptExcel::COptExcel(void)  
  25. {  
  26.     if (::CoInitialize( NULL ) == E_INVALIDARG)   
  27.     {   
  28.         AfxMessageBox(_T("初始化Com失败!"));   
  29.         return;  
  30.     }  
  31.   
  32.     //验证office文件是否可以正确运行  
  33.   
  34.     if( !app.CreateDispatch(_T("Excel.Application")) )  
  35.     {  
  36.         AfxMessageBox(_T("无法创建Excel应用!"));  
  37.         return;  
  38.     }  
  39.     //在程序执行文件路径名中,剪掉执行文件名,得到程序路径,追加模板文件名,得到模板完整路径  
  40.       
  41.   
  42. }  
  43.   
  44.   
  45.   
  46. ///Function:    ~COptExcel  
  47. ///Description: 析构函数,释放对象,非常重要,不全部释放,占用内存,下  
  48. ///             一次使用此类时会中断  
  49. ///Call:        ReleaseDispatch()  
  50.   
  51. COptExcel::~COptExcel(void)  
  52. {  
  53.       
  54.   
  55.       
  56.     books.ReleaseDispatch();  
  57.     book.ReleaseDispatch();  
  58.     sheets.ReleaseDispatch();  
  59.     sheet.ReleaseDispatch();  
  60.     range.ReleaseDispatch();  
  61.     font.ReleaseDispatch();  
  62.     cell.ReleaseDispatch();  
  63.   
  64.     app.Quit();  
  65.   
  66.     app.ReleaseDispatch();  
  67.     ::CoUninitialize();  
  68. }  
  69.   
  70.   
  71.   
  72. ///Function:    OpenExcelBook  
  73. ///Description: 打开表名为filename的文件,注意,文件路径非自动生成,以后  
  74. ///             考虑从下处理方法  
  75. ///Call:        GetAppPath()  
  76. ///Input:       CString filename 文件名  
  77.   
  78. bool COptExcel::OpenExcelBook(CString filename)  
  79. {  
  80.     CFileFind filefind;   
  81.     if( !filefind.FindFile(filename) )   
  82.     {   
  83.         AfxMessageBox(_T("文件不存在"));  
  84.         return false;  
  85.     }  
  86.     LPDISPATCH lpDisp; //接口指针  
  87.     books=app.GetWorkbooks();  
  88.     lpDisp = books.Open(filename,  
  89.         covOptional, covOptional, covOptional, covOptional,  
  90.         covOptional, covOptional, covOptional, covOptional,  
  91.         covOptional, covOptional, covOptional, covOptional,  
  92.         covOptional, covOptional  
  93.         );                                      //与office 2000的不同,是个参数的,直接在后面加了两个covOptional成功了  
  94.     book.AttachDispatch(lpDisp);  
  95.     sheets=book.GetSheets();  
  96.     sheet=sheets.GetItem(COleVariant((short)1));        //与的不同,是个参数的,直接在后面加了两个covOptional成功了  
  97.     return true;  
  98. }  
  99. void COptExcel::NewExcelBook()  
  100. {  
  101.     books=app.GetWorkbooks();  
  102.     book=books.Add(covOptional);  
  103.     sheets=book.GetSheets();  
  104.     sheet=sheets.GetItem(COleVariant((short)1));        //与的不同,是个参数的,直接在后面加了两个covOptional成功了  
  105. }  
  106.   
  107.   
  108. ///Function:    OpenExcelApp  
  109. ///Description: 打开应用程序(要注意以后如何识别用户要打开的是哪个文件)  
  110.   
  111. void COptExcel::OpenExcelApp(void)  
  112. {  
  113.     app.SetVisible(TRUE);  
  114.     app.SetUserControl(TRUE);  
  115. }  
  116.   
  117.   
  118. ///Function:    SaveExcel  
  119. ///Description: 用于打开数据文件,续存数据后直接保存  
  120.   
  121. void COptExcel::SaveExcel(void)  
  122. {  
  123.     book.SetSaved(TRUE);  
  124. }  
  125.   
  126.   
  127. ///Function:    SaveAsExcel  
  128. ///Description: 保存excel文件  
  129.   
  130. void COptExcel::SaveAsExcel(CString filename)  
  131. {  
  132.     book.SaveAs(COleVariant(filename),covOptional,  
  133.     covOptional,covOptional,  
  134.     covOptional,covOptional,(long)0,covOptional,covOptional,covOptional,  
  135.     covOptional,covOptional);                     
  136. }  
  137.   
  138.   
  139.   
  140. ///Function:    SetCellValue  
  141. ///Description: 修改单元格内的值  
  142. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串  
  143. ///Input:       int row 单元格所在行  
  144. ///             int col 单元格所在列  
  145. ///             int Align       对齐方式默认为居中  
  146.   
  147. void COptExcel::SetCellValue(int row, int col,int Align)  
  148. {  
  149.     range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  150.     range.SetValue2(COleVariant(value));  
  151.     cell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);  
  152.     cell.SetHorizontalAlignment(COleVariant((short)Align));  
  153. }  
  154.   
  155.   
  156. ///Function:    GetCellValue  
  157. ///Description: 得到的单元格中的值  
  158. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串  
  159. ///Input:       int row 单元格所在行  
  160. ///             int col 单元格所在列  
  161. ///Return:      CString 单元格中的值  
  162.   
  163. CString COptExcel::GetCellValue(int row, int col)  
  164. {  
  165.     range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  166.     COleVariant rValue;  
  167.     rValue=COleVariant(range.GetValue2());  
  168.     rValue.ChangeType(VT_BSTR);  
  169.     return CString(rValue.bstrVal);  
  170. }  
  171.   
  172. ///Function:    SetRowHeight  
  173. ///Description: 设置行高  
  174. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串  
  175. ///Input:       int row 单元格所在行  
  176.   
  177. void COptExcel::SetRowHeight(int row, CString height)  
  178. {  
  179.     int col = 1;  
  180.     range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  181.     range.SetRowHeight(COleVariant(height));  
  182. }  
  183.   
  184. ///Function:    SetColumnWidth  
  185. ///Description: 设置列宽  
  186. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串  
  187. ///Input:       int col 要设置列宽的列  
  188. ///             CString 宽值  
  189.   
  190. void COptExcel::SetColumnWidth(int col,CString width)  
  191. {  
  192.     int row = 1;  
  193.     range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  194.     range.SetColumnWidth(COleVariant(width));  
  195. }  
  196.   
  197.   
  198. ///Function:    SetRowHeight  
  199. ///Description: 设置行高  
  200. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串  
  201. ///Input:       int row 单元格所在行  
  202.   
  203. CString COptExcel::GetColumnWidth(int col)  
  204. {  
  205.     int row = 1;  
  206.     range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  207.     VARIANT width = range.GetColumnWidth();  
  208.     CString strwidth;  
  209.     strwidth.Format(CString((LPCSTR)(_bstr_t)(_variant_t)width));  
  210.     return strwidth;  
  211. }  
  212.   
  213.   
  214. ///Function:    GetRowHeight  
  215. ///Description: 设置行高  
  216. ///Call:        IndexToString() 从(x,y)坐标形式转化为“A1”格式字符串  
  217. ///Input:       int row 要设置行高的行  
  218. ///             CString 宽值  
  219.   
  220. CString COptExcel::GetRowHeight(int row)  
  221. {  
  222.     int col = 1;  
  223.     range=sheet.GetRange(COleVariant(IndexToString(row,col)),COleVariant(IndexToString(row,col)));  
  224.     VARIANT height = range.GetRowHeight();  
  225.     CString strheight;  
  226.     strheight.Format(CString((LPCSTR)(_bstr_t)(_variant_t)height));  
  227.     return strheight;  
  228. }  
  229.   
  230.   
  231.   
  232. ///Function:    IndexToString  
  233. ///Description: 得到的单元格在EXCEL中的定位名称字符串  
  234. ///Input:       int row 单元格所在行  
  235. ///             int col 单元格所在列  
  236. ///Return:      CString 单元格在EXCEL中的定位名称字符串  
  237.   
  238. CString COptExcel::IndexToString( int row, int col )   
  239. {   
  240.     CString strResult;  
  241.     if( col > 26 )   
  242.     {   
  243.         strResult.Format(_T("%c%c%d"),'A' + (col-1)/26-1,'A' + (col-1)%26,row);  
  244.     }   
  245.     else   
  246.     {   
  247.         strResult.Format(_T("%c%d"), 'A' + (col-1)%26,row);  
  248.     }   
  249.     return strResult;  
  250. }   
  251.   
  252.   
  253. ///Function:    LastLineIndex  
  254. ///Description: 得到表格总第一个空行的索引  
  255. ///Return:      int 空行的索引号  
  256.   
  257. int COptExcel::LastLineIndex()   
  258. {   
  259.     int i,j,flag=0;  
  260.     CString str;  
  261.     for(i=1;;i++)  
  262.     {  
  263.         flag = 0;  
  264.         //粗略统计,认为前列都没有数据即为空行  
  265.         for(j=1;j<=5;j++)  
  266.         {  
  267.             str.Format(_T("%s"),this->GetCellValue(i,j).Trim());  
  268.             if(str.Compare(_T(""))!=0)  
  269.             {  
  270.                 flag = 1;  
  271.                 break;  
  272.             }  
  273.               
  274.         }  
  275.         if(flag==0)  
  276.             return i;  
  277.           
  278.     }  

1.     VS2005添加COM

Project-> addclass -> MFC -> MFC CLASS FROM TypeLib

选择_Application/_Workbook/_Worksheet/Workbooks/Worksheet/Range



点击finish 后生成

CApplication.h

CWorkbook.h

CWorkbooks.h

CWorksheet.h

CWorksheets.h

CRange.h

删掉这些文件,导入excel9.h,excel9.cpp


  1. <strong>2.  在对应的程序文件中添加头文件#include "excel9.h"  
  2. 在程序中启用COM服务库</strong>  
  3.   
  4.  // 初始化 OLE 库  
  5.     if (!AfxOleInit())  
  6.     {  
  7.         AfxMessageBox(L"Could not initialize COM dll");  
  8.         return FALSE;  
  9.     }  
  10.    if (CoInitialize(NULL) != S_OK)          
  11. return -1;  
  12.   
  13.   
  14. <strong>下面是一个处理EXCEL的程序例子,可直接调用:</strong>  
  15. void OnBnClickedButtonCaln()  
  16. {  
  17.     // TODO: 在此添加控件通知处理程序代码  
  18.     // TODO: Add your control notification handler code here   
  19.   
  20.     Range m_ExlRge;  
  21.     _Worksheet m_ExlSheet;  
  22.     Worksheets m_ExlSheets;   
  23.     _Workbook m_ExlBook;   
  24.     Workbooks m_ExlBooks;   
  25.     _Application m_ExlApp;   
  26.   
  27.   
  28.     //用m_ExlApp对象创建Excel2003进程   
  29.   
  30.     if(!m_ExlApp.CreateDispatch(_T("Excel.Application"),NULL))   
  31.     {   
  32.         AfxMessageBox(_T("创建Excel服务失败!"));   
  33.         return;   
  34.     }   
  35.   
  36.     //设置为可见   
  37.     m_ExlApp.SetVisible(TRUE);   
  38.   
  39.     ///下面得到应用程序所在的路径///   
  40.     CString theAppPath,theAppName;   
  41. //  char Path[MAX_PATH];   
  42.   
  43. //  GetModuleFileName(NULL,Path,MAX_PATH);//得到应用程序的全路径   
  44.     GetModuleFileName(NULL,_T("D:\\1.xlt"),MAX_PATH);//得到应用程序的全路径   
  45.     //theAppPath=(CString)Path;   
  46.     theAppPath=_T("D:\\1.xlt");  
  47.   
  48.     theAppName=AfxGetApp()->m_pszAppName;   
  49.     theAppName+=_T(".exe");   
  50.   
  51.     //把最后的文件名去掉   
  52.     int length1,length2;   
  53.   
  54.     length1=theAppPath.GetLength();   
  55.     length2=theAppName.GetLength();   
  56.   
  57.     theAppPath.Delete(length1-length2,length2);   
  58.        
  59.   
  60.   
  61.     CString TempPath=_T("");   
  62.   
  63.     //TempPath=theAppPath+_T("Template.xls");//EXCEL模板的路径   
  64.     TempPath=theAppPath;  
  65.   
  66.     m_ExlBooks.AttachDispatch(m_ExlApp.GetWorkbooks(),TRUE);   
  67.   
  68.     m_ExlBook.AttachDispatch(m_ExlBooks.Add((COleVariant)TempPath),TRUE);//加载EXCEL模板   
  69.   
  70.     m_ExlSheets.AttachDispatch(m_ExlBook.GetSheets(),TRUE);//加载Sheet页面   
  71.   
  72.     //添加新的Sheet页面   
  73.     m_ExlSheets.Add(vtMissing,vtMissing,COleVariant((long)1),vtMissing);   
  74.   
  75.     //删除第二个Sheet页面   
  76.     m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(COleVariant((long)2)),TRUE);   
  77.     m_ExlSheet.Delete();   
  78.   
  79.     //把第一个Sheet页面的名字改变为TestSheet   
  80.     m_ExlSheet.AttachDispatch(m_ExlSheets.GetItem(COleVariant((long)1)),TRUE);   
  81.     m_ExlSheet.SetName(_T("TestSheet"));   
  82.   
  83.   
  84.     ///合并第一行单元格A1至D1//   
  85.   
  86.     //加载要合并的单元格   
  87.     m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);   
  88.   
  89.     m_ExlRge.Merge(COleVariant((long)0));   
  90.   
  91.     设置表格内容   
  92.   
  93.     m_ExlRge.AttachDispatch(m_ExlSheet.GetCells(),TRUE);//加载所有单元格   
  94.   
  95.     m_ExlRge.SetItem(COleVariant((long)1),COleVariant((long)1),COleVariant(_T("数学系研究生课程统计")));   
  96.   
  97.     m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)1),COleVariant(_T("课程名")));   
  98.     m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("课时")));   
  99.     m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)3),COleVariant(_T("难度")));   
  100.     m_ExlRge.SetItem(COleVariant((long)2),COleVariant((long)4),COleVariant(_T("教学方式")));   
  101.   
  102.     m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)1),COleVariant(_T("泛函分析")));   
  103.     m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)2),COleVariant(_T("60")));   
  104.     m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)3),COleVariant(_T("普通")));   
  105.     m_ExlRge.SetItem(COleVariant((long)3),COleVariant((long)4),COleVariant(_T("老师讲课")));   
  106.   
  107.     m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)1),COleVariant(_T("微分流形")));   
  108.     m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)2),COleVariant(_T("40")));   
  109.     m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)3),COleVariant(_T("变态难")));   
  110.     m_ExlRge.SetItem(COleVariant((long)4),COleVariant((long)4),COleVariant(_T("自学")));   
  111.   
  112.     m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)1),COleVariant(_T("二阶椭圆型方程与方程组")));   
  113.     m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)2),COleVariant(_T("60")));   
  114.     m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)3),COleVariant(_T("很难")));   
  115.     m_ExlRge.SetItem(COleVariant((long)5),COleVariant((long)4),COleVariant(_T("讨论")));   
  116.   
  117.   
  118.     m_ExlRge.AttachDispatch(m_ExlSheet.GetUsedRange());//加载已使用的单元格   
  119.   
  120.     m_ExlRge.SetWrapText(COleVariant((long)1));//设置单元格内的文本为自动换行   
  121.   
  122.     //设置齐方式为水平垂直居中   
  123.     //水平对齐:默认=1,居中=-4108,左=-4131,右=-4152   
  124.     //垂直对齐:默认=2,居中=-4108,左=-4160,右=-4107   
  125.     m_ExlRge.SetHorizontalAlignment(COleVariant((long)-4108));   
  126.     m_ExlRge.SetVerticalAlignment(COleVariant((long)-4108));   
  127.   
  128.     ///设置整体的字体、字号及颜色//   
  129.   
  130.     Font ft;   
  131.   
  132.     ft.AttachDispatch(m_ExlRge.GetFont());   
  133.   
  134.     ft.SetName(COleVariant(_T("宋体")));//字体   
  135.     ft.SetColorIndex(COleVariant((long)11));//字的颜色   
  136.     ft.SetSize(COleVariant((long)12));//字号   
  137.   
  138.     ///设置标题字体及颜色//   
  139.   
  140.     m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))));   
  141.   
  142.     ft.AttachDispatch(m_ExlRge.GetFont());   
  143.   
  144.     ft.SetBold(COleVariant((long)1));//粗体   
  145.     ft.SetSize(COleVariant((long)13));   
  146.     ft.SetColorIndex(COleVariant((long)2));   
  147.   
  148. //  CellFormat cf;   
  149. //  cf.AttachDispatch(m_ExlRge.GetCells());   
  150.   
  151.     //设置底色/   
  152.   
  153.     Interior it;   
  154.   
  155.     it.AttachDispatch(m_ExlRge.GetInterior());   
  156.   
  157.     it.SetColorIndex(COleVariant((long)11));//标题底色   
  158.   
  159.     表格内容的底色   
  160.   
  161.     m_ExlRge.AttachDispatch(m_ExlSheet.GetRange(COleVariant(_T("A2")),COleVariant(_T("D5"))));   
  162.   
  163.     it.AttachDispatch(m_ExlRge.GetInterior());   
  164.   
  165.     it.SetColorIndex(COleVariant((long)15));   
  166.   
  167.   
  168.     //为表格设置边框/   
  169.   
  170.     Range UnitRge;   
  171.     CString CellName;   
  172.   
  173.     for(int i=1;i<=4;i++)   
  174.     {   
  175.         for(int j=1;j<=4;j++)   
  176.         {       
  177.             CellName.Format(_T("%c%d"),j+64,i);//单元格的名称   
  178.   
  179.             UnitRge.AttachDispatch(m_ExlRge.GetRange(COleVariant(CellName),COleVariant(CellName)));//加载单元格   
  180.   
  181.             //LineStyle=线型 Weight=线宽 ColorIndex=线的颜色(-4105为自动)   
  182.             UnitRge.BorderAround(COleVariant((long)1),(long)2,((long)-4105),vtMissing);//设置边框   
  183.         }   
  184.     }   
  185.   
  186.   
  187.   
  188.     //释放对象(相当重要!)   
  189.     m_ExlRge.ReleaseDispatch();   
  190.     m_ExlSheet.ReleaseDispatch();   
  191.     m_ExlSheets.ReleaseDispatch();   
  192.     m_ExlBook.ReleaseDispatch();   
  193.     m_ExlBooks.ReleaseDispatch();   
  194.     //m_ExlApp一定要释放,否则程序结束后还会有一个Excel进程驻留在内存中,而且程序重复运行的时候会出错   
  195.     m_ExlApp.ReleaseDispatch();   
  196.   
  197.     //退出程序 m_ExlApp.Quit();   
  198.   
  199.   



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值