我用VC6.0生成excel 2003报表,使用动态链接库。我的电脑是Windows XP的,木有问题.但是换别的电脑就有问题了。Win7的就不行,连程序都打不开,换了几个动态库后才能打开,但老是提示“创建excel服务器失败”,WIN7的装没装VC6.0都一样的错误提示。找了几台Windows XP的电脑,也不行,能打开程序,但仍提示“创建excel服务器失败”。换成了静态链接库后,有的Windows XP电脑能创建报表成功,有的还是不行。注册表搜索Excel.Application也是存在的,有值。请各位大侠指点一下,有木有别的方法?我试了几种别的方式,代码好像都有问题,编译一下好多的错误。网上找了下,有说CreateDispatch这个是老接口了;新的office用的都是CreateInstance了。用老方法会直接出错的。但是CreateInstance的代码我用着编译一下更出错,不知道是我哪里出错了还是CreateInstance的代码错了废话了这么多,代码呈上:void COut::OnBtnReport() 
{
//变量定义
_Application ExcelApp;    
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;

COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);     //初始化COM的动态连接库
if(CoInitialize(NULL)==0)  
{
AfxMessageBox("无法初始化COM的动态连接库!");
return ;
}    //创建Excel 2000服务器(启动Excel) 
if (!ExcelApp.CreateDispatch("Excel.Application",NULL)) 

AfxMessageBox("创建Excel服务失败!");//有的电脑运行到这里就不行了。有的又可以运行
exit(1); 

ExcelApp.SetVisible(false); //使Excel不可见
ExcelApp.SetUserControl(TRUE); //允许其它用户控制Excel //利用模板文件建立新文档 
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,path);
CString strPath = path;
strPath += "\\excel\\testtemplate";
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);  wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t(strPath)));
//得到Worksheets 
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到sheet1 
CString str1;
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
str1 = "第1页";
wsMysheet.SetName(str1); for( int i=0;i<wssMysheets.GetCount()-1;i++)
{
wsMysheet = wsMysheet.GetNext();
str1.Format("第%d页",i+2);
wsMysheet.SetName(str1);
} wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("第1页")),true);
//得到全部Cells,此时,rgMyRge是cells的集合 
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);  /****************************************************************************/
for(int setnum=0; setnum < m_ListOut.GetItemCount(); setnum++ )
{
////////////////////////在excel中插入字段///////////////////////////
rgMyRge.SetItem(_variant_t((long)(2+setnum)),_variant_t((long)(1)),
_variant_t( m_ListOut.GetItemText( setnum, 1 ) ) );  

} /**************************************************************************/ /////////////////////////////////表格保存//////////////////////////////
strPath = path;
strPath += "\\excel\\test.xls";
wsMysheet.SaveAs(strPath,vtMissing,vtMissing,vtMissing,vtMissing,\
vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);
ExcelApp.SetVisible(true); 
wbMyBook.PrintPreview(_variant_t(false)); 

///////////释放对象/////////// 
rgMyRge.ReleaseDispatch(); 
wsMysheet.ReleaseDispatch(); 
wssMysheets.ReleaseDispatch(); 
wbMyBook.ReleaseDispatch(); 
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch(); 

wbMyBook.Close(covOptional,COleVariant(strPath),covOptional);
wbsMyBooks.Close(); 
wsMysheet.Delete();
wssMysheets.Delete();
rgMyRge.Clear();
ExcelApp.Quit();   
}

解决方案 »

  1.   

    这个应该是和目标机器装的OFFICE有关,安装完整版的Office然后再试,有很多OFFICE都是
    简化版的,东西不全。所以出这个问题。
      

  2.   

    恩,试了一下。和目标机器装的OFFICE有点关系。安装完整版的Office静态链接库的程序可以生成报表,动态链接库的不行。
    简化版的Office程序无法生成报表。求解~~~~~~~
      

  3.   

    简化版本的OFFICE估计没有支持COM接口直接调用,既然是简化版本,肯定裁剪了很多东西,所以估计不能调用
      

  4.   

    我也遇到同样的问题啊,咱俩代码差不多,别人写的程序用来创建EXCEL都可以,我自己照别人的方法写的都不行,非要重装office么?
      

  5.   

    已经解决了我在   InitInstance() 用了这句 
    CoInitialize(NULL)
      
      if   (CoInitialize(NULL)==0) 

    AfxMessageBox( "初始化COM   支持库失败! "); 
    exit(1); 
    }CoUninitialize();
    就编译通过了