com口操作excel
- _Application app; //Excel应用程序接口
- Workbooks books; //工作薄集合
- _Workbook book; //工作薄
- Worksheets sheets; //工作表集合
- _Worksheet sheet; //工作表
- Range range; //Excel中针对单元格的操作都应先获取其对应的Range对象
- Font font;
- Range cols;
- /*
- COleVariant类为VARIANT数据类型的包装,在自动化程序中,通常都使用
- VARIANT数据类型进行参数传递。故下列程序中,函数参数都是通过COleVariant
- 类来转换了的。
- */
- //covOptional 可选参数的VARIANT类型
- COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
- if( !app.CreateDispatch(L"Excel.Application") ){
- this->MessageBox(L"无法创建Excel应用!");
- return;
- }
- //获取工作薄集合
- books=app.GetWorkbooks();
- //添加一个工作薄
- book=books.Add(covOptional);
- //获取工作表集合
- sheets=book.GetSheets();
- //获取第一个工作表
- sheet=sheets.GetItem(COleVariant((short)1));
- range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格
- range.SetNumberFormat(COleVariant(L"@")); //将单元格设置为文本类型
- //合并单元格
- //加载要合并的单元格
- range.AttachDispatch(sheet.GetRange(COleVariant(_T("A1")),COleVariant(_T("D1"))),TRUE);
- range.Merge(COleVariant((long)0));
- range.AttachDispatch(sheet.GetCells(),TRUE);//加载所有单元格
- range.SetItem(COleVariant((long)1),COleVariant((long)1),COleVariant(_T("数学系研究生课程统计"))); //A1
- range.SetItem(COleVariant((long)2),COleVariant((long)1),COleVariant(_T("课程名"))); //A2
- range.SetItem(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("课时"))); //B2
函数 SetNumberFormat() 用于设置单元格的格式,但是首先我们必须知道所有格式的标记。
文本类: |
数值类: |
日期类: |
百分比: |
详细请打开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; 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; 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范围内 设置图片宽高 |
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; 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范围内 设置图片宽高 |
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的更多相关文章
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- C#通过NPOI操作Excel
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...
- POI操作Excel
POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...
- NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析
哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...
- VB操作EXCEL文件
用VB操作Excel(VB6.0)(整理) 首先创建Excel对象,使用ComObj:Dim ExcelID as Excel.ApplicationSet ExcelID as new Excel. ...
- VB.NET操作Excel
VB.NET操作Excel的基本方法与例子:
- C# 操作excel单元格居中
C# 操作excel //导出Excel private void ExportExcel(string fileName, System.Data.DataTable myDGV, s ...
- NPOI操作Excel辅助类
/// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...
- JAVA的POI操作Excel
1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...
随机推荐
- YTU 2896: J--Zipper
2896: J--Zipper 时间限制: 1 Sec 内存限制: 128 MB 提交: 29 解决: 15 题目描述 Given three strings, you are to determ ...
- 如何用Mac远程桌面连接windows
打开mac,连接网络,找到系统中自带的“远程桌面连接”软件,截图如下
- BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理
BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理 Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以 ...
- yum: Cannot find a valid baseurl for repo: migsrv解决方法
yum安装程序报错: Loaded plugins: fastestmirror Setting up Update Process Determining fastest mirrors Could ...
- Linux 常用命令六 cp和mv
一.cp命令 Linux中的复制命令. 复制文件: wang@wang:~/workpalce/python$ tree . ├── .txt ├── dir └── module directori ...
- bzoj 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头【瞎搞】
某种意义上真毒瘤?我没看懂题啊...于是看了题解 就是筛约数的那种方法,复杂度调和级数保证O(nlogn) 所以这题啥意思啊 #include<iostream> #include< ...
- 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...
- (5)css盒子模型(基础上)
CSS 盒子模型概述 ***什么是CSS的盒子模型呢?为什么叫它是盒子?先说说我们在网页设计中常听的属性名:内容(content).边框(border).内边距(padding).外边距(margin ...
- golang——关于for循环的学习
1.for循环的用法 (1)常规用法 func main() { slice := []int{1, 2, 3, 4, 5, 6} //方式1 for i := 0; i < len(slice ...
- Python生成器实现斐波那契数列
比如,斐波那契数列:1,1,2,3,5,8,13,21,34.... 用列表生成式写不出来,但是我们可以用函数把它打印出来: def fib(number): n, a, b = 0, 0, 1 wh ...