Excel自动化时无法正常关闭Excel的解决方案

最近的项目中需要利用VC操作Excel进行自动化输出,期间碰到网上很多朋友遇到的一个问题,无法正常关闭Excel。经过琢磨,总结如下:

1、原因:由于使用了RangeGetItem()函数获取Excel表中内容,所以程序在调用了_ApplicationQuit()函数后,Excel进程不能马上关闭,整个程序退出时,Excel将关闭。若注释了调用GetItem()的代码,将可以正常关闭。内部原因不知。

2、解决办法,不使用GetItem()获取Excel中内容,而使用其他方法。如下代码介绍读取数据的一种方法:

  1. BOOLCAutomationExcel::GetValue(intiRow,intiColumnStart,intiColumnStop,CStringArray&strarray)
  2. {
  3. intiElementCount=iColumnStop-iColumnStart+1;
  4. if(iElementCount<=0)
  5. returnFALSE;
  6. CStringstrStart,strEnd;
  7. _variant_tstart,stop;
  8. strStart=GetItemName(iRow,iColumnStart);
  9. start.vt=VT_BSTR;
  10. start.bstrVal=strStart.AllocSysString();//不需要进行_bstr_t转换
  11. strEnd=GetItemName(iRow,iColumnStop);
  12. stop.vt=VT_BSTR;
  13. stop.bstrVal=strEnd.AllocSysString();
  14. //创建安全数组,从Excel中读取内容
  15. _variant_tvarReturn;
  16. varReturn.vt=VT_ARRAY|VT_VARIANT;
  17. SAFEARRAYBOUNDsab[2];//必须为维
  18. sab[0].lLbound=1;
  19. sab[0].cElements=iElementCount;
  20. sab[1].lLbound=1;
  21. sab[1].cElements=iElementCount;
  22. varReturn.parray=SafeArrayCreate(VT_VARIANT,2,sab);
  23. Rangerange;
  24. range.AttachDispatch(m_Range.GetRange(start,stop));
  25. if(range.m_lpDispatch==NULL)
  26. returnFALSE;
  27. varReturn=range.GetValue2();
  28. range.ReleaseDispatch();
  29. strarray.RemoveAll();
  30. //从安全数组中读取数据
  31. CStringstr;
  32. if(iElementCount==1)
  33. {
  34. CVariantCast(varReturn).GetValue(str);
  35. strarray.Add(str);
  36. }
  37. else
  38. {
  39. _variant_ttmp;
  40. for(inti=1;i<=iElementCount;++i)
  41. {
  42. longindices[]={1,i};
  43. SafeArrayGetElement(varReturn.parray,indices,(void*)&tmp);
  44. CVariantCast(tmp).GetValue(str);
  45. strarray.Add(str);
  46. }
  47. }
  48. returnTRUE;
  49. }

其中CVariantCast为一个自己实现的转换类,使用的代码如下:

  1. inlinevoidCVariantCast::GetValue(CString&strValue)
  2. {
  3. strValue.Empty();
  4. if(m_variant.vt==VT_EMPTY||m_variant.vt==VT_NULL)
  5. return;
  6. if(m_variant.vt==VT_BOOL)
  7. {
  8. if(m_variant.boolVal)
  9. strValue=_T("TRUE");
  10. else
  11. strValue=_T("FALSE");
  12. return;
  13. }
  14. m_variant.ChangeType(VT_BSTR);
  15. strValue=m_variant.bstrVal;
  16. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值