你當(dāng)前的位置>>主頁(yè)>>AutoCAD知識(shí)>>AutoCAD二次開(kāi)發(fā)
 
            在AutoCAD中動(dòng)態(tài)讀取Excel數(shù)據(jù)

   在實(shí)際的工作中,我們經(jīng)常要對(duì)一些表格數(shù)據(jù)進(jìn)行處理,如果先把這些表格數(shù)據(jù)通過(guò)Excel處理,再導(dǎo)入到AutoCAD,
那絕對(duì)會(huì)起到事半功倍的效果。隨著Automation編程技術(shù)的出現(xiàn),我們可以很方便地實(shí)現(xiàn)這一點(diǎn)了,下面是個(gè)
ObjectARX的例子,其功能是動(dòng)態(tài)關(guān)聯(lián)Excel,然后讀取其數(shù)據(jù),并將這些數(shù)據(jù)打印在文本域中。

//動(dòng)態(tài)從Excel讀取數(shù)據(jù)
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庫(kù),程序結(jié)束時(shí)COM庫(kù)會(huì)自動(dòng)釋放
 if(!AfxOleInit())
 { 
  MessageBox(NULL,"初始化COM支持庫(kù)失敗!\n無(wú)法控制Excel!", \
   "TrueTable",MB_IConERROR | MB_OK);  
  return RTERROR;
 } 
  
 //關(guān)聯(lián)已經(jīng)運(yùn)行的Excel實(shí)例
 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, "沒(méi)有發(fā)現(xiàn)Excel!", "TrueTable", MB_ICONHAND);
  return RTERROR;
 }

 if (pUnk)  pUnk->Release();
 
 //關(guān)聯(lián)Excel
 app.AttachDispatch (pRunDisp);

 //得到當(dāng)前活躍sheet
 //如果有單元格正處于編輯狀態(tài)中,此操作不能返回,會(huì)一直等待
 lpDisp=app.GetActiveSheet();
 if(lpDisp==NULL)
 {
  MessageBox(NULL, "沒(méi)有發(fā)現(xiàn)有效的表格!", \
   "TrueTable",MB_IConERROR | MB_OK); 
  app.ReleaseDispatch (); 

  return RTERROR;
 }
 sheet.AttachDispatch(lpDisp);
 
 //已經(jīng)使用的行數(shù):
 long row_num;
 range.AttachDispatch(sheet.GetUsedRange());
 range.AttachDispatch(range.GetRows());
 row_num=range.GetCount();
  
 
 //已經(jīng)使用的列數(shù):
 long col_num;
 range.AttachDispatch(sheet.GetUsedRange());
 range.AttachDispatch(range.GetColumns());
 col_num=range.GetCount();

 //已經(jīng)使用區(qū)域的起始行、列:
 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當(dāng)前表格沒(méi)有數(shù)據(jù)!", \
   "TrueTable",MB_IConERROR | MB_OK); 
  app.ReleaseDispatch (); 

  return RTERROR;
  
 }
 else
 {
  ads_printf("\n表格%s共%d行,%d列",SheetName,row_num,col_num);
 }
  
 
  
 //得到全部Cells,此時(shí),range是cells的集合 
 range.AttachDispatch(sheet.GetCells()); 
  
  
 //讀寫數(shù)據(jù)了
 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的話,關(guān)鍵函數(shù)就是:
 iCell.SetItem(COleVariant(i),COleVariant(j),COleVariant(cstr)); 

民眾工作室.制作      版權(quán)所有