切换到宽版
  • 广告投放
  • 稿件投递
  • 繁體中文
  • 在AutoCAD中动态读取Excel数据的方法

    作者:佚名 来源:光行天下论坛整理 时间:2011-03-13 11:17 阅读:1811 [投稿]
    随着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**)&amp;pUnk);
      if(SUCCEEDED(hr)) 
      {
       hr = pUnk->QueryInterface(IID_IDispatch, (void **)&amp;pRunDisp);
       break;
      }
      ::Sleep(10);
     }
     
     if (!pRunDisp) 
     {
      ::MessageBox(NULL, &#34;没有发现Excel!&#34;, &#34;TrueTable&#34;, MB_ICONHAND);
      return RTERROR;
     }

     if (pUnk)  pUnk->Release();
     
     //关联Excel
     app.AttachDispatch (pRunDisp);

     //得到当前活跃sheet
     //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
     lpDisp=app.GetActiveSheet();
     if(lpDisp==NULL)
     {
      MessageBox(NULL, &#34;没有发现有效的表格!&#34;, \
       &#34;TrueTable&#34;,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(&#34;\n%s&#34;,SheetName); 
     if(col_num<2 &amp;&amp; row_num<2)     //此sheet为空
     {
      MessageBox(NULL,&#34;\n当前表格没有数据!&#34;, \
       &#34;TrueTable&#34;,MB_IConERROR | MB_OK); 
      app.ReleaseDispatch (); 

      return RTERROR;
      
     }
     else
     {
      ads_printf(&#34;\n表格%s共%d行,%d列&#34;,SheetName,row_num,col_num);
     }
      
     //得到全部Cells,此时,range是cells的集合 
     range.AttachDispatch(sheet.GetCells()); 
      
     //读写数据了
     CString cstr;
     ads_printf(&#34;\n&#34;);
     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(&#34;%s    &#34;,(LPTSTR)cstr);
          
      }
      ads_printf(&#34;\n&#34;);
     }

     //释放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
    文章点评