我用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();
}
{
//变量定义
_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();
}
简化版的,东西不全。所以出这个问题。
简化版的Office程序无法生成报表。求解~~~~~~~
CoInitialize(NULL)
if (CoInitialize(NULL)==0)
{
AfxMessageBox( "初始化COM 支持库失败! ");
exit(1);
}CoUninitialize();
就编译通过了