之前一直用ODBC的方式操作EXCEL文件,但是在程序运行过程中不断写入文件,程序就直接退出,没有任何提示信息。我就这段代码做一个按钮进行文件写入就是正常的,可惜采用了RELEASE方式的OBJ文件导致了无法进行DEBUG,所以打算放弃ODBC操作EXCEL文件的方式,在采用直接操作EXCEL文件的方式,出现代码运行就弹出“0X5F58A35A 指令引用的 0xCCCCCCCC 内存。该内存不能为 read”,请问是怎么回事。我的环境如下:1.本机安装office 2007;2.用class wizard添加了excel.h和excel.cpp,
在dlg.h中添加了_Application m_oExcelApp;
_Worksheet m_oWorkSheet;
_Workbook  m_oWorkBook;
Workbooks  m_oWorkBooks;
Worksheets m_oWorkSheets;
Range      m_oCurrRange;在添加了dlg.cpp中的OnInitDialog()中添加了if(CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化com支持库失败");
exit(1);

}
if(!m_oExcelApp.CreateDispatch(_T("EXCEL.Application"),NULL))
{
::MessageBox(NULL,_T("创建Excel服务失败!"),_T("错误提示!"),MB_OK|MB_ICONERROR);
}
m_oExcelApp.SetVisible(false);
m_oWorkSheets.AttachDispatch(m_oExcelApp.GetWorkbooks(),TRUE);
在button函数中添加了LPDISPATCH lpDisp=NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)TRUE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
Range oCurrCell;
lpDisp=m_oWorkBooks.Open("D:\\excel_test\test.xls",
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing),
_variant_t(vtMissing)
);
// 获得活动的WorkBook( 工作簿 )
       m_oWorkBook.AttachDispatch( lpDisp, TRUE );
   // 获得活动的WorkSheet( 工作表 )
       m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
       // 获得使用的区域Range( 区域 )
       m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
   
       // 获得使用的行数
       long lgUsedRowNum = 0;
       m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
       lgUsedRowNum = m_oCurrRange.GetCount();
       // 获得使用的列数
       long lgUsedColumnNum = 0;
       m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
       lgUsedColumnNum = m_oCurrRange.GetCount();
       // 读取Sheet的名称
       CString strSheetName = m_oWorkSheet.GetName();
   
       //得到全部Cells,此时,CurrRange是cells的集合 
       m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE ); 

解决方案 »

  1.   


    CString strPath;
    _Application xlsapp; //应用程序
        Workbooks    xlsbooks; //工作簿组
        _Workbook    xlsbook; //工作簿
        Worksheets    xlssheets; //工作表表
        _Worksheet    xlssheet; //工作表
        Range xlsrange, //行
    xlscell, //单元格
    usedRange; //使用的行
        
    LPDISPATCH lpDisp; //事件响应参数
        COleVariant vResult((long)1, VT_I4); //公用OLE变体
        COleVariant covTrue((short)TRUE),
    covFalse((short)FALSE),
    covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); ////////////////////////////////Excel Operate Start
    //开始excel,获得应用程序对象。
        if(!xlsapp.CreateDispatch("Excel.Application"))
        {
            AfxMessageBox("Couldn't start Excel and get an application 0bject");
            return 0;
        } //设置可见性
        xlsapp.SetVisible(FALSE); //设置应用程序不可见
        xlsapp.SetUserControl(FALSE);    xlsbooks.AttachDispatch(xlsapp.GetWorkbooks()); //取得工作簿集合 // Open a workbook.
    //打开文件(一个工作簿)
    lpDisp = xlsbooks.Add(covOptional);
    ASSERT(lpDisp); //It should have worked.
        xlsbook.AttachDispatch(lpDisp); // Attach to a Workbook object.

    lpDisp = xlsbook.GetSheets();
    xlssheets.AttachDispatch(lpDisp); m_strStat="状态:正在保存脚本制作环节表格...";
    UpdateData(FALSE); lpDisp = xlssheets.GetItem( COleVariant((short)(1)) );
    xlssheet.AttachDispatch(lpDisp);
    xlssheet.SetName("脚本制作"); i=1;
    for(j='A'; j<'I'; j++)
    {
    sprintf(pcTmp,"%c%d",j, i);
    xlsrange = xlssheet.GetRange(COleVariant(pcTmp),COleVariant(pcTmp));
    if(j=='A')
    xlsrange.SetValue2(COleVariant("第一列,第一行"));
    //...................
    } GetCurrentDirectory(MAX_PATH, pcColumn);
    strcat(pcColumn, "\\test.xls");
    xlsbook.SaveAs(COleVariant(pcColumn), //VA_FileName,
    covOptional, //VA_FileFormat,
    covOptional, //VA_Password,
    covOptional, //VA_WriteResPassword,
    covOptional, //VA_ReadOnlyRecommended,
    covOptional, //VA_CreateBackup,
    0, //long_AccessMode,
    covOptional, //VA_ConfilictResolution,
    covOptional, //VA_AddToMru,
    covOptional, //VA_TextCodepage,
    covOptional, //VA_TextVisualLayOut,
    covOptional); //VA_Local); xlsbook.Close(covFalse,COleVariant(""),covFalse);
    xlsbooks.Close();
    xlsapp.Quit();
      

  2.   

    basicexcel--可以参考一下里面的代码
      

  3.   

    我也在做vc操作excel,是excel2007,在网上找了好久都没有能用的上的,和我要达到的效果都不一样。