天气与日历 切换到窄版

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

ObjectARX动态读取excel

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

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

     

     

     

     

    ObjectARX动态读取excel
    中国膜结构网打造全中国最好的膜结构综合平台 ,统一协调膜结构设计,膜结构施工,膜材采购,膜材定制,膜结构预算全方位服务。 中国空间膜结构协会合作单位。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-7-1 05:44 , Processed in 0.057355 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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