龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

在VC中使用智能指针操作Excel(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
3.上一步使用xlWorkbook参数添加了一个工作簿,因此,这个工作簿中默认有一个工作表,同样的道理,在工作簿中有一个工作表集合,要操作工作表,首先

  3.上一步使用xlWorkbook参数添加了一个工作簿,因此,这个工作簿中默认有一个工作表,同样的道理,在工作簿中有一个工作表集合,要操作工作表,首先得到工作表集合。SheetsPtr pSheets = pBook->GetWorksheets();可以这样_WorksheetPtr pSheet = pSheets->GetItem(1);也可以这样_WorksheetPtr pSheet = pBook->GetActiveSheet();来得到默认创建的那个工作表。这是因为当前只有一个工组表,所以这个工组表就默认为激活的工作表(在工作簿中只会有一个工作表处于激活状态,就是当前操作的这个工作簿)。

  如果工作簿中有多个工组表,还是需要通过pSheets->GetItem函数获得工作表对象。补充,有些操作可以在工作表处于非激活状态下进行,这样,使用pSheets->GetItem获得工作表对象即可对工作表操作,但是有些操作必须是工作表处于激活状态下进行,因此,获得工作表对象后,还需要pSheet->Activate();激活它。

  给工作表重命名吧:pSheet->PutName("Exp One Sheet");//如果运行有错,可以pSheet->PutName(L"Exp One Sheet")插入一个工作表,函数原型:
_WorksheetPtr Worksheets::Add(
const _variant_t &Before = vtMissing,   //在哪个工作表前插入
const _variant_t &After = vtMissing,   //在哪个工作表后插入
const _variant_t &Count = vtMissing,   //插入工组表个数
const _variant_t &Type = vtMissing)    //插入工作表类型
有意思的是,不光这个函数,其他的有默认值的参数的默认值都是vtMissing 。

  遗憾的是我没能找到vtMissing的具体说明,姑且先用着。看下面的代码:

_WorksheetPtr pSheet = pSheets->GetItem(2);
VARIANT var;
   var.vt = VT_DISPATCH;var.pdispVal = pSheet;
pSheets->Add();         //在第一个工作表之前插入一个空白工作表
pSheets->Add(var);        //在pSheet工作表之前插入一个空白工作表
pSheets->Add(vtMissing,var);   //在pSheet工作表之后插入一个空白工作表
pSheets->Add(vtMissing,var,2);  //在pSheet工作表之后插入两个空白工作表
这里仅仅涉及到_variant_t类型的使用,将不做说明。

  注意前两个参数的使用即可,其他类型的参数将报错。

  4.下面将让你看到不同于C风格的代码操作工作表中的单元格。

pSheet->Range["A1"][vtMissing]->Value2 = "EXP A1";
pSheet->Range["A1"][vtMissing]->Interior->Color = RGB(255,0,0);
pSheet->Range["A1"][vtMissing]->Font->Name = L"隶书";
pSheet->Range["A1"][vtMissing]->Font->FontStyle = L"Bold Italic";
pSheet->Range["A1"][vtMissing]->Font->Size = 10;

  如何?是不是有点像VB?只需要赋值就能改变对象的属性,以上代码等价于:

RangePtr range = pSheet->GetRange("A3",vtMissing);
range->PutValue2("EXP A3");
InteriorPtr interior = range->GetInterior();
interior->PutColor(RGB(255,0,0));
Excel::FontPtr font = range->GetFont();
font->PutName(L"隶书");
font->PutFontStyle(L"Bold Italic");
font->PutSize(10);

  VC的程序员看到这段代码是不是就觉得亲切了,这是COM技术的魔力,要想知道为何,自己研究COM技术吧。对上面的代码只做两点说明:

  (1)Range["A1"][vtMissing]和GetRange("A3",vtMissing)表示获得A3表示的单元格(用过Excel的人都知道A3表示什么),通过集合的形式表现出来,该集合只有一个单元格。如果把vtMissing换成B5,那么将获得一个由A3和B5之间左右单元组成的集合。

  (2)FontPtr之前的Excel::是必须的,缺少Excel::编译器会报错,提示不能确定是哪一个FontPtr,因为在不同的命名空间中存在若干个FontPtr。也许还存在其他的类型会有这样的情况,因此,要特别留意命名空间的限制。

  五、小经验1.基于COM技术,一般的,I = A->GetP()可以等价成I = A->P;A->PutP(I)可以等价成A->P = I。

  2.在Microsoft Excel Visual Basic 参考中查找对象,方法和属性的时候,可以基于第一点将VB转换成VC。根据VB提供的参数类型,在VC中使用VARIANT类型承载。

精彩图集

赞助商链接