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. if( !app.CreateDispatch(L"Excel.Application") ){
  17. this->MessageBox(L"无法创建Excel应用!");
  18. return;
  19. }
  20. //获取工作薄集合
  21. books=app.GetWorkbooks();
  22. //添加一个工作薄
  23. book=books.Add(covOptional);
  24. //获取工作表集合
  25. sheets=book.GetSheets();
  26. //获取第一个工作表
  27. sheet=sheets.GetItem(COleVariant((short)1));
  28. range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格
  29. range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型
  30. //合并单元格
  31. //加载要合并的单元格
  32. range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);
  33. range.Merge(COleVariant((long)0));
  34. range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格
  35. range.SetItem(COleVariant((long)1),COleVariant((long)1),COleVariant(_T("数学系研究生课程统计")));  //A1
  36. range.SetItem(COleVariant((long)2),COleVariant((long)1),COleVariant(_T("课程名")));              //A2
  37. 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  否则不起作用

com口操作excel的更多相关文章

  1. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  2. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  3. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  4. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  5. VB操作EXCEL文件

    用VB操作Excel(VB6.0)(整理) 首先创建Excel对象,使用ComObj:Dim ExcelID as Excel.ApplicationSet ExcelID as new Excel. ...

  6. VB.NET操作Excel

    VB.NET操作Excel的基本方法与例子:

  7. C# 操作excel单元格居中

    C# 操作excel //导出Excel        private void ExportExcel(string fileName, System.Data.DataTable myDGV, s ...

  8. NPOI操作Excel辅助类

    /// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...

  9. JAVA的POI操作Excel

    1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...

随机推荐

  1. Get started with Sourcetree

    Understand the interface Bookmarks window From that window, select the Local or Remote buttons to vi ...

  2. 删除oracle数据库用户的dba权限(当出现同一用户DBA可以登录,normal不能登录)“无法对SYS拥有的对象创建触发器”

    系统报错:“无法对SYS拥有的对象创建触发器”,搞不懂是什么原因了,到底这触发器要用什么用户才能建立啊? ORA-04089: 无法对 SYS 拥有的对象创建触发器 第一种方式: 首先,用sys用户a ...

  3. bzoj 4543 HOTEL 加强版

    题目大意: 求树上取三个点这三个点两两距离相等的方案数 思路: 远古时候的$n^2$做法是换根 但那样无法继续优化了 学习了一波长链剖分 考虑如何在一棵树上进行dp 设$f[i][j]$表示以$i$为 ...

  4. bzoj 3991 寻宝游戏

    题目大意: 一颗树 有一个点的集合 对于每个集合的答案为 从集合内一个点遍历集合内所有点再返回的距离最小值 每次可以选择一个点 若在集合外便加入集合 若在集合内就删除 求每次操作后这个集合的答案 思路 ...

  5. KMP算法在字符串中的应用

    KMP算法是处理字符串匹配的一种高效算法 它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配.从渐进的意义上说,这样时间复杂度已经是最好的了,需要O(m+n)时间.对KMP的学习可以 ...

  6. java笔记之IO3读操作

    * 字节输入流操作步骤: * A:创建字节输入流对象 * B:调用read()方法读取数据,并把数据显示在控制台 * C:释放资源 *  * 读取数据的方式: * A:int read():一次读取一 ...

  7. HDU 4893 Wow! Such Sequence! (树状数组)

    题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...

  8. bzoj 3566: [SHOI2014]概率充电器【树形概率dp】

    设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...

  9. 微信小程序中如何使用setData --- 修改数组对象、修改对象

    看代码吧~ 这是修改对象 this.setData({ allStageIndex: e.detail.value, [`projectDetailsData.stage`]: this.data.a ...

  10. 微信支付接口调用问题(android正常,iphone调不起)

    转自:http://blog.csdn.net/tt123123/article/details/53897035 碰到的问题 :根据微信提供的示例代码(ASP.NET),配置好一切后, 用andro ...