查看完整版本: 在AutoCAD中動態讀取Excel數據
頁: [1]

chenghou.tw 發表於 2009-4-22 12:28 AM

在AutoCAD中動態讀取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));...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

murphy0709 發表於 2009-5-15 04:41 PM

我剛開了個討論AutoCAD的社群
http://blog.eyny.com/space.php?do=mtag&tagid=2202
歡迎CAD玩家有空來逛逛唄

XTMAN 發表於 2009-5-15 07:08 PM

真是太強,我也很想學會利用參數設定去進行系列性的產品圖面繪製

michael171717 發表於 2009-5-16 12:40 AM

很實用正好需要
謝謝大大的分享
頁: [1]