设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 5169|回复: 4
打印 上一主题 下一主题

Excel编程版本不兼容问题!??

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-23 18:08:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用VC对Excel编程,遇到版本不兼容的问题,恳求各位能够指点一下!

机器1是XP操作系统,officeXP,用以下代码打开Excel文件,本机编译(其它代码略),然后进行读写,没有问题。



机器2是XP操作系统,office2003,同样用以下代码打开Excel文件,本机编译(其它代码略),然后进行读写,没有问题。



问题是:

如果在机器1(officeXP)上编译后的.exe文件拿到机器2上运行(office2003),在运行到CreateDispatch(_T("Excel.Application"), NULL)时就会抛出一个异常,进入到代码中的“catch(...)”分支。



如果在机器2(office2003)上编译后的.exe文件拿到机器1(officeXP)上运行,在运行到CreateDispatch(_T("Excel.Application"), NULL)时就会返回失败。



为了避免版本的兼容问题,我使用的是Excel9来访问Excel,但还是有问题,

后来发现,即使两台机器都是OfficeXP,如果版本不同,问题也同样存在。



请问高手这个问题的原因是什么,如何解决?



万分感谢!



附代码:



BOOL CMLCExcelSheet::OpenExcelFile(CString strExcelFile)

{

    try

    {

        m_pExcelApp = new _Application;

        if (!m_pExcelApp)

        {

            AfxMessageBox("new _Application; Failed!", MB_OK);

            return FALSE;

        }

        

        if (!m_pExcelApp->CreateDispatch(_T("Excel.Application"), NULL))

        {

            AfxMessageBox("Create Excel Service failed!", MB_OK);

            return FALSE;

        }

        



        m_pExcelApp->SetVisible(FALSE);



        m_ExcelBooks = m_pExcelApp->GetWorkbooks();

        m_ExcelBooks.Open(strExcelFile,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,

            vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);

        m_WorkBook.AttachDispatch(m_pExcelApp->GetApplication());

   

        m_ExcelSheets = m_WorkBook.GetSheets();

        m_WorkSheet = m_ExcelSheets.GetItem(COleVariant((short)m_nSheetNum));

        m_WorkSheet.Activate();

    }

    //Catch control-specific exceptions.

    catch (COleDispatchException * e)

    {

        CString cStr;

        

        if (!e->m_strSource.IsEmpty())

            cStr = e->m_strSource + " - ";

        if (!e->m_strDescription.IsEmpty())

            cStr += e->m_strDescription;

        else

            cStr += _T("unknown error");

        

        AfxMessageBox(cStr, MB_OK);

        

        e->Delete();

        return FALSE;

    }

    //Catch all MFC exceptions, including COleExceptions.

    // OS exceptions will not be caught.

    catch (CException *e)

    {

        CString cStr;

        cStr.Format(_T("%s(%d): OLE Execption caught: SCODE = %x"),

            __FILE__, __LINE__, COleException:rocess(e));

        

        AfxMessageBox(cStr, MB_OK);

      

        e->Delete();

        return FALSE;

    }

    catch(...)

    {

        AfxMessageBox("CMLCExcelSheet::OpenExcelFile(CString strExcelFile) Exception", MB_OK);

        return FALSE;

    }



    return TRUE;

}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-8-24 21:50:00 | 只看该作者
采用后引用方式,先判断版本,再根据情况后引用。
3#
 楼主| 发表于 2005-8-29 23:17:00 | 只看该作者
谢谢 xlonger,这个问题已经困扰我很长时间了,能说的具体点吗?非常感谢!!!
4#
发表于 2005-9-2 00:16:00 | 只看该作者
声明对象变量,可以创建一个能包含任何类型对象引用的变量。不过,该变量访问对象是后期绑定的,也就是说,绑定在程序运行时才进行。要创建一个使用前期绑定方式的对象变量,也就是说,在程序编译时就完成绑定,则对象变量在声明时应指定类 ID。
5#
 楼主| 发表于 2005-9-5 18:28:00 | 只看该作者
xlonger,非常感谢您的回复!不过实在不好意思,我还是没能没白具体该怎样操作,能否麻烦您在我代码的基础上稍稍做点改动,示范一下,衷心感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-21 13:44 , Processed in 0.093291 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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