VC在EXCEL中画出的图形如何组合一起

iuspace 2011-03-07 04:27:29
VC调用excel,在其中画一个圆和两条线,如何实现将这3个图形组合一起的功能.
(excel中可以选中这3个图形右键菜单:组合->组合)
在excel中实现的vba代码如下:
ActiveSheet.Shapes.Range(Array("Oval 1", "Line 2", "Line 3")).Select
Selection.ShapeRange.Group.Select

在MSDN上查到如下帮助
http://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.shapes(v=office.11).aspx

Use Shapes.Range(index), where index is the shape’s name or index number or an array of shape names or index numbers, to return a ShapeRange collection that represents a subset of the Shapes collection.


但是,这里提到的数组不知如何用,尝试用如下代码可以编译,但是运行时出错.应该明显有问题.
shape=shapes->AddShape(msoShapeOval,BLeft,BTop,Width,Height);
shapeName1=shape->Name.GetBSTR();
shape=shapes->AddLine(BLeft+1.5,BTop+1.5,BLeft+6.5,BTop+6.5);
shapeName2=shape->Name.GetBSTR();
shape=shapes->AddLine(BLeft+1.5,BTop+6.5,BLeft+6.5,BTop+1.5);
shapeName3=shape->Name.GetBSTR();
//实现将图形组合
CString aa[3];
aa[0]=shapeName1;
aa[1]=shapeName2;
aa[2]=shapeName3;
pThisWorksheet->Shapes->Range[aa]->Select();//此处执行时有问题
//pThisWorksheet->GetShapes()->GetRange(aa)->Select();
//shape->GroupItems;//不知组合是否此句实现

谁有做过类似效果,请不吝赐教.多谢
...全文
836 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyutao2008 2011-03-15
  • 打赏
  • 举报
回复
以下代码测试通过
参考http://social.msdn.microsoft.com/forums/en-us/vclanguage/thread/3035CFD1-7989-4CB8-B987-B6F574B3DDA3

void CtestxlsDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//获取当前应用程序目录
TCHAR path[MAX_PATH];
CString strPath;
GetModuleFileName(NULL,path,MAX_PATH);
strPath = path;
int nPos = strPath.ReverseFind('\\');
strPath=strPath.Left(nPos+1);
strPath += L"test.xls";

HANDLE hFind;
WIN32_FIND_DATA findData = {0};
hFind=FindFirstFile(strPath,&findData);
if(hFind == INVALID_HANDLE_VALUE)
{
CString TempfileStr;
TempfileStr.Format(L"XLS文件'%s'不存在",strPath);
AfxMessageBox(TempfileStr);
return;
}
//////////////////////////////////////////////////////////////////////////
Excel::_ApplicationPtr pApplication = NULL;
Excel::_WorkbookPtr pThisWorkbook = NULL;
Excel::_WorksheetPtr pThisWorksheet = NULL;
Excel::SheetsPtr pThisSheets = NULL;
Excel::RangePtr pThisRange = NULL;
Excel::ShapesPtr shapes=NULL;
Excel::ShapePtr shape=NULL;
Excel::LinesPtr lines=NULL;
pApplication.CreateInstance("Excel.Application");
pApplication->PutVisible(0,VARIANT_FALSE); //将Excel程序隐藏
pApplication->PutDisplayAlerts(0,VARIANT_FALSE); //不弹出消息框(如果有)
//////////////////////////////////////////////////////////////////////////
pThisWorkbook = pApplication->GetWorkbooks()->Add(_variant_t(strPath)); //读模版
pThisSheets = pThisWorkbook->GetWorksheets();
pThisWorksheet = pThisSheets->GetItem((short)1);
pThisRange = pThisWorksheet->GetRange("A1");
shapes = pThisWorksheet->GetShapes();
lines = pThisWorksheet->Lines();
//////////////////////////////////////////////////////////////////////////
CString Name1,Name2,Name3,tmpStr;
//////////////////////////////////////////////////////////////////////////
shapes->AddShape(msoShapeRectangle,200,100,20,20); //此图形单独,不需要组合
//以下图形为一个整体,需要组合
shape=shapes->AddShape(msoShapeOval,100,100,20,20); //圆
Name1=shape->GetName().GetBSTR();
shape=shapes->AddLine(100,100,120,120); //画线
Name2=shape->GetName().GetBSTR();
shape=shapes->AddLine(120,100,100,120); //画线
Name3=shape->GetName().GetBSTR();
//////////////////////////////////////////////////////////////////////////
//选中上面添加的后三个图形,并实现组合功能
SAFEARRAY* pSafeArray = SafeArrayCreateVectorEx(VT_VARIANT, 1, 3, NULL);
if (pSafeArray)
{
VARIANT* apVariantData;
HRESULT hResult = SafeArrayAccessData(pSafeArray, reinterpret_cast<void**> (&apVariantData));
if (SUCCEEDED(hResult))
{
apVariantData[0].vt = VT_BSTR;
apVariantData[0].bstrVal = SysAllocString(Name1);
apVariantData[1].vt = VT_BSTR;
apVariantData[1].bstrVal = SysAllocString(Name2);
apVariantData[2].vt = VT_BSTR;
apVariantData[2].bstrVal = SysAllocString(Name3);
SafeArrayUnaccessData(pSafeArray);
}
CComVariant rangeIndexes(pSafeArray);
pThisWorksheet->GetShapes()->GetRange(&rangeIndexes)->Group();
SafeArrayDestroy(pSafeArray);
}

//excel中的vba实现代码如下:
//ActiveSheet.Shapes.Range(Array("Oval 2", "Line 3", "Line 4")).Select
//Selection.ShapeRange.Group.Select

//////////////////////////////////////////////////////////////////////////
pApplication->PutDisplayAlerts(0,VARIANT_TRUE); //弹出消息框(如果有)
pApplication->PutVisible(0,VARIANT_TRUE);
}
liuyutao2008 2011-03-15
  • 打赏
  • 举报
回复
也在寻找,帮顶
也就是翻译VBA语句为VC
ActiveSheet.Shapes.Range(Array("Oval 1", "Line 2", "Line 3")).Select
Selection.ShapeRange.Group.Select
iuspace 2011-03-08
  • 打赏
  • 举报
回复
现在要处理的工作主要有两个.
1.如何选择所有所需对象
2.如何将所选择对象组合
需要在vc程序中实现这些操作.不借用excel中的宏.不在excel内写宏然后由程序调用
csorca 2011-03-08
  • 打赏
  • 举报
回复
如果支持 EXCEL 宏操作, 你可以使用这句, 前台是你已经选择了所有需要组合的对象

Selection.ShapeRange.Group.Select

5,140

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧