在AutoCAD中动态读取Excel数据的方法
随着Automation编程技术的出现,我们可以很方便地实现这一点了,下面是个ObjectARX的例子,其功能是动态关联Excel,然后读取其数据,并将这些数据打印在文本域中。
在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过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<StartRow+row_num;i++) { for(long j=StartCol;j<StartCol+col_num;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)); |
【温馨提示】本频道长期接受投稿,内容可以是:
1.行业新闻、市场分析。 2.新品新技术(最新研发出来的产品技术介绍,包括产品性能参数、作用、应用领域及图片); 3.解决方案/专业论文(针对问题及需求,提出一个解决问题的执行方案); 4.技术文章、白皮书,光学软件运用技术(光电行业内技术文档);
如果想要将你的内容出现在这里,欢迎联系我们,投稿邮箱:service@opticsky.cn
1.行业新闻、市场分析。 2.新品新技术(最新研发出来的产品技术介绍,包括产品性能参数、作用、应用领域及图片); 3.解决方案/专业论文(针对问题及需求,提出一个解决问题的执行方案); 4.技术文章、白皮书,光学软件运用技术(光电行业内技术文档);
如果想要将你的内容出现在这里,欢迎联系我们,投稿邮箱:service@opticsky.cn
文章点评