天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 66|回复: 0

ObjectARX动态读取excel

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过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)); [/code]

 

 

 

 

ObjectARX动态读取excel
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 13:32 , Processed in 0.195079 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表