溜溜问答 > 平面设计 > CAD问答 > 如何将CAD与Excel联动,在AutoCAD中动态读取Excel数据?
丶         东
丶 东
邀请你来回答
845人阅读 2020-12-22

如何将CAD与Excel联动,在AutoCAD中动态读取Excel数据?

我要回答
2个回答

在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过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));

查看全部
2020-12-22
回复 采纳

在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过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));

查看全部
2020-12-22
回复 采纳

相关问题

怎么在vb中读取Excel的数据?
共2条回答 >
铎洺: dima(3,3)asintegefori=1to3forj=1to3'这步是利用a到c之间的ascii码来处理,如果是i循环1,5的话,那就会是a,b,c,d,e,内循环j管a3~a5,a(i,j)=int(xlsheet.range(chr(asc("a")+i-1))&cstr(j+2))nextj,i
(3) 回复
Excel怎么制作图表与数据联动的动态图表?
共2条回答 >
设计诗与远方: 1.数据源名称定义  用Excel2013打开数据表,点击“公式→定义名称”,在弹出窗口的名称处输入“分类轴”,引用位置处输入“=OFFSET($A$2,,,COUNTA($A:$A)-1,1)”;以同样的方式再定义一个名称为“数值轴”的名称,引用位置处输入“=OFFSET($B$2,,,COUNTA($A:$A)-1,1)”(图2)。  2.图表数据源修改  数据源名称定义完成后,就该修改柱形图的两个数据源了。  右击柱形图,选择“选择数据”,在弹出的窗口中点击“图例项(系列)”下的“编辑”按....
(3) 回复
AutoCAD中vba如何循环读取Excel中的数据?
共1条回答 >
豪门装饰~私人定制13793886467: 你可以设置双循环定义参数,类似于C++的i++
回复
Excel数据怎么与PPT联动?
共1条回答 >
明天的明天: 1.首先,选择并复制EXCEL表格中的数据。2.复制后,打开PPT文档并单击开始。3.然后在开始列中找到“粘贴”,单击其下拉菜单,然后单击“特殊粘贴”选项进入。4.输入后点击粘贴链接,在的列中选择Excel作为粘贴的数据源。5.设置完成后,点击页面上的“确定”,PPT中的图表和EXCEL中的数据就可以自动同步更新了。
回复
如何读取Excel中的数据?
共0条回答 >
发表成功!
感谢您的分享!
好的