描述:
我要实现的功能在vb里边时这样写的,
1.io_App.Workbooks(S_FileName).Sheets(S_SheetName).Range(sRange).Select
io_App.Workbooks(S_FileName).Sheets(S_SheetName).Pictures.Insert (sImageFile)
2.io_App.Workbooks(S_FileName).Sheets(S_SheetName).Shapes.AddTextbox(1, x, y, length, width).Name = s_TextName
io_App.Workbooks(S_FileName).Sheets(S_SheetName).DrawingObjects(s_TextName).ShapeRange.Fill.Visible = 0
在vc中,用classWizard,把excel中的所带的excel9.olb中的所有class加载了进来,上边第一个所要实现的功能就是向excel中指定的cell中插入图片,但是如何在sheets类与Pictures类之间建立关系呢? 第二个就是在sheet中增加图形,然后重新设置这个图形的属性,但是如何在sheets类与DrawingObjects类之间建立关系呢?
这两者之间的关系,我怎么也建立不起来,望高人指点!一定给分!!
解决方案1:
开发基于com的自动化组件,不一定要用vc,既然有vb代码,直接开发一个基于vb的自动化组件岂不是更好。
使用atl开发,一般不选support mfc,减小组件的大小。你用class wizard引入类型库,则一定要选上support mfc,否则编译不过去。其实,可以用import "excel.olb"代替。
调用组件的属性,在vc的包裹类要用set/get方法,不能直接用xx.propertyName的方式。
出差几日耽误了
你用sheets这种集合类得到的是IDispatch*,你要用DrawObjects对象attach.
sheets是个集合类,item()方法是它的默认方法。Sheets(S_SheetName)等于sheets.item(s_sheetName)。你用item()方法得到IDispatch*,再用DrawObjects.attach()就能用了。
#import 就是使用智能指针,用它可以代替使用classWizard-->From a Type Library
用法是
#import "C:\\Program Files\\Microsoft Office\\Office\\EXCEL9.OLB"
_WorksheetPtr 相当于 _Worksheet*
我看了一下,GroupObjects是隐藏的,你用classWizard-->From a Type Library可能看不到这个成员函数,
[id(0x00000459), hidden, helpcontext(0x00010459)]
HRESULT GroupObjects(
[in, optional] VARIANT Index,
[in, lcid] long lcid,
[out, retval] IDispatch** RHS);
还有一个成员函数 OLEObjects
[id(0x0000031f), helpcontext(0x0001031f)]
HRESULT OLEObjects(
[in, optional] VARIANT Index,
[in, lcid] long lcid,
[out, retval] IDispatch** RHS);
你都试试,看看用 "Pictures"做参数,那个能正常得回IDispatch接口