当读完一个EXCEL单元格的内容后,要想继续读其它单元格的内容为什么必须要再次重新读一次整个EXCEL表?,否则,第二条读语句读到的内容和上一条读语句读到的内容完整一样,好象是不起作用似的。我测试过,肯定是这个效果的。这是为什么?我能不能只读一次EXCEL表(sheet.getcells()),然后可以访问任意的单元格内容?range.AttachDispatch(sheet.GetCells());读一次EXCEL表。
range.AttachDispatch((range.GetItem(_variant_t((long)2),_variant_t((long)3))).pdispVal);
COleVariant vResult =range.GetValue2();
int cc=int(vResult.dblVal);
range.AttachDispatch(sheet.GetCells());必须要重读一次EXCEL表。
range.AttachDispatch((range.GetItem(_variant_t((long)1),_variant_t((long)1))).pdispVal);
    vResult =range.GetValue2();
int dd=int(vResult.dblVal); 

解决方案 »

  1.   

    range.AttachDispatch(sheet.GetCells());读一次EXCEL表。
    Range a;
    a.AttachDispatch((range.GetItem(_variant_t((long)2),_variant_t((long)3))).pdispVal);
    COleVariant vResult =a.GetValue2();
    int cc=int(vResult.dblVal);
    //range.AttachDispatch(sheet.GetCells());必须要重读一次EXCEL表。
    Range b;
    b.AttachDispatch((range.GetItem(_variant_t((long)1),_variant_t((long)1))).pdispVal);
    vResult =b.GetValue2();
    int dd=int(vResult.dblVal); 
      

  2.   

    楼上给出的代码和我的没有任何区别啊?不能实现我说的功能。我的目的是不想每读一个单元格内容就必须重新读一遍整个EXCEL表,这样的效率极低!!,我的目标是只读一次EXCEL表(sheet),然后就可以访问任意的单元格内容。不清楚我表达清楚没有?
      

  3.   

    不好意思,刚才没有仔细看,确实和我之前给的代码不一样。这次确实成功!!!
    按楼上高手的指点:我改了一下代码:
    range.AttachDispatch(sheet.GetCells());
    Range c;
    c.AttachDispatch((range.GetItem(_variant_t((long)2),_variant_t((long)3))).pdispVal);
    COleVariant vResult =c.GetValue2();
    int cc=int(vResult.dblVal);c.AttachDispatch((range.GetItem(_variant_t((long)1),_variant_t((long)1))).pdispVal);
    vResult =c.GetValue2();
    int dd=int(vResult.dblVal); 这次就确实成功了,得到了我的预期结果。能请教一下,这个是为什么吗?这次只不过是用新的Range 对象C,间接访问原始的Range 对象"range" . 再有,我之前给出的代码,如果调整一下顺序也能得到预期结果:
    range.AttachDispatch(sheet.GetCells());读一次EXCEL表。
    range.AttachDispatch((range.GetItem(_variant_t((long)1),_variant_t((long)1))).pdispVal);
    COleVariant vResult =range.GetValue2();
    int cc=int(vResult.dblVal);
    //range.AttachDispatch(sheet.GetCells());没有必要再读一次EXCEL表了。
    range.AttachDispatch((range.GetItem(_variant_t((long)2),_variant_t((long)3))).pdispVal);
        vResult =range.GetValue2();
    int dd=int(vResult.dblVal);  (好象是,只能先访问小地址单元格,再访问大地址单元格才可以。晕!)
      

  4.   

    我以前测试过使用VC这种方法逐行读取excel超级慢(8000多行,12列),大概耗时10秒左右,而用VBA写的代码耗时不到1秒.
      

  5.   

    range.AttachDispatch((range.GetItem(_
    会把以前的内容(准确一点应该是释放了指向all cells的接口指针,再指向sub cell),如同 i = i + 1;至于为什么换一下顺序就好,没清楚,我对Excel的Automation不熟。