在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过Excel处理,再导入到AutoCAD,那绝对会起到事半功倍的效果。随着Automation编程技术的出现,我们可以很方便地实现这一点了,下面是个objectarx的例子,其功能是动态关联Excel,然后读取其数据,并将这些数据打印在文本域中。
//动态从Excel读取数据
int
dynamiCReadfromExcel()
{
//常用变量定义
_application
app;
workbooks
books;
_workbook
book;
worksheets
sheets;
_worksheet
sheet;
range
range;
range
icell;
lpdispatch
lpdisp;
colevariant
covtrue((short)true),
covfalse((short)false),
covoptional((long)disp_e_paramnotfound,
vt_error);
colevariant
VReSUlt;
//采用mfc方式初始化com库,程序结束时com库会自动释放
if(!afxoleinit())
{
messagebox(null,"初始化com支持库失败!n无法控制Excel!",
"truetable",mb_iconerror
|
mb_ok);
return
rterror;
}
//关联已经运行的Excel实例
clsID
clsID;
clsIDfromProgID(l"Excel.application",
&clsID);
iunknown
*punk
=
null;
IDispatch
*PRundisp
=
null;
For(long
i=1;i<=5;i++)
//做5次尝试
{
hreSUlt
hr
=
getactiveobject(clsID,
null,
(iunknown**)&punk);
if(SUCCeeded(hr))
{
hr
=
punk->queryinterface(iID_IDispatch,
(voID
**)&PRundisp);
Break;
}
::sleep(10);
}
if
(!PRundisp)
{
::messagebox(null,
"没有发现Excel!",
"truetable",
mb_iconhand);
return
rterror;
}
if
(punk)
punk->release();
//关联Excel
app.attachdispatch
(PRundisp);
//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpdisp=app.getactivesheet();
if(lpdisp==null)
{
messagebox(null,
"没有发现有效的表格!",
"truetable",mb_iconerror
|
mb_ok);
app.releasedispatch
();
return
rterror;
}
sheet.attachdispatch(lpdisp);
//已经使用的行数:
long
row_num;
range.attachdispatch(sheet.getusedrange());
range.attachdispatch(range.getrows());
row_num=range.getcount();
//已经使用的列数:
long
col_num;
range.attachdispatch(sheet.getusedrange());
range.attachdispatch(range.getcolumns());
col_num=range.getcount();
//已经使用区域的起始行、列:
range.attachdispatch(sheet.getusedrange());
long
startrow=range.getrow();
//起始行
long
startcol=range.getcolumn();
//起始列
//读取sheet名
CString
sheetname=sheet.getname();
//ads_PRintf("n%s",sheetname);
if(col_num<2
&&
row_num<2)
//此sheet为空
{
messagebox(null,"n当前表格没有数据!",
"truetable",mb_iconerror
|
mb_ok);
app.releasedispatch
();
return
rterror;
}
else
{
ads_PRintf("n表格%s共%d行,%d列",sheetname,row_num,col_num);
}
//得到全部cells,此时,range是cells的集合
range.attachdispatch(sheet.getcells());
//读写数据了
CString
CStr;
ads_PRintf("n");
For(long
i=startrow;i
For(long
j=startcol;j
//读取单元格文本
icell.attachdispatch(range.getitem
(colevariant(i),colevariant(j)).pdispval
);
VReSUlt
=icell.gettext();
CStr=VReSUlt.bstrval;
//写单元格文本
ads_PRintf("%s
",(lptstr)CStr);
}
ads_PRintf("n");
}
//释放dispatch
icell.releasedispatch
();
range.releasedispatch
();
sheet.releasedispatch
();
sheets.releasedispatch
();
book.releasedispatch
();
books.releasedispatch
();
app.releasedispatch
();
return
rtnorm;
}
如果要输出到Excel的话,关键函数就是:
icell.setitem(colevariant(i),colevariant(j),colevariant(CStr));
在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过Excel处理,再导入到AutoCAD,那绝对会起到事半功倍的效果。随着Automation编程技术的出现,我们可以很方便地实现这一点了,下面是个objectarx的例子,其功能是动态关联Excel,然后读取其数据,并将这些数据打印在文本域中。
//动态从Excel读取数据
int dynamiCReadfromExcel()
{
//常用变量定义
_application app;
workbooks books;
_workbook book;
worksheets sheets;
_worksheet sheet;
range range;
range icell;
lpdispatch lpdisp;
colevariant
covtrue((short)true),
covfalse((short)false),
covoptional((long)disp_e_paramnotfound, vt_error);
colevariant VReSUlt;
//采用mfc方式初始化com库,程序结束时com库会自动释放
if(!afxoleinit())
{
messagebox(null,"初始化com支持库失败!n无法控制Excel!",
"truetable",mb_iconerror | mb_ok);
return rterror;
}
//关联已经运行的Excel实例
clsID clsID;
clsIDfromProgID(l"Excel.application", &clsID);
iunknown *punk = null;
IDispatch *PRundisp = null;
For(long i=1;i<=5;i++) //做5次尝试
{
hreSUlt hr = getactiveobject(clsID, null, (iunknown**)&punk);
if(SUCCeeded(hr))
{
hr = punk->queryinterface(iID_IDispatch, (voID **)&PRundisp);
Break;
}
::sleep(10);
}
if (!PRundisp)
{
::messagebox(null, "没有发现Excel!", "truetable", mb_iconhand);
return rterror;
}
if (punk) punk->release();
//关联Excel
app.attachdispatch (PRundisp);
//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpdisp=app.getactivesheet();
if(lpdisp==null)
{
messagebox(null, "没有发现有效的表格!",
"truetable",mb_iconerror | mb_ok);
app.releasedispatch ();
return rterror;
}
sheet.attachdispatch(lpdisp);
//已经使用的行数:
long row_num;
range.attachdispatch(sheet.getusedrange());
range.attachdispatch(range.getrows());
row_num=range.getcount();
//已经使用的列数:
long col_num;
range.attachdispatch(sheet.getusedrange());
range.attachdispatch(range.getcolumns());
col_num=range.getcount();
//已经使用区域的起始行、列:
range.attachdispatch(sheet.getusedrange());
long startrow=range.getrow(); //起始行
long startcol=range.getcolumn(); //起始列
//读取sheet名
CString sheetname=sheet.getname();
//ads_PRintf("n%s",sheetname);
if(col_num<2 && row_num<2) //此sheet为空
{
messagebox(null,"n当前表格没有数据!",
"truetable",mb_iconerror | mb_ok);
app.releasedispatch ();
return rterror;
}
else
{
ads_PRintf("n表格%s共%d行,%d列",sheetname,row_num,col_num);
}
//得到全部cells,此时,range是cells的集合
range.attachdispatch(sheet.getcells());
//读写数据了
CString CStr;
ads_PRintf("n");
For(long i=startrow;i
For(long j=startcol;j
//读取单元格文本
icell.attachdispatch(range.getitem (colevariant(i),colevariant(j)).pdispval );
VReSUlt =icell.gettext();
CStr=VReSUlt.bstrval;
//写单元格文本
ads_PRintf("%s ",(lptstr)CStr);
}
ads_PRintf("n");
}
//释放dispatch
icell.releasedispatch ();
range.releasedispatch ();
sheet.releasedispatch ();
sheets.releasedispatch ();
book.releasedispatch ();
books.releasedispatch ();
app.releasedispatch ();
return rtnorm;
}
如果要输出到Excel的话,关键函数就是:
icell.setitem(colevariant(i),colevariant(j),colevariant(CStr));