VC 使用FlexGrid控件显示数据, 然后将FlexGrid控件显示的数据导出到excel中(保存文件在指定路径下),导出成功后,excel后台程序没有退出。
如果设置导出显示excel内容,然后手动关闭excel没有问题,但想导出到指定路径下,不显示出来。FlexGrid数据导出到execl后,FlexGrid上数据就没有了,为什么?谢谢!!!代码如下: if( !app.CreateDispatch("Excel.Application") )
{
this->MessageBox("无法创建Excel应用!,是否安装Excel!");
return;
} books =app.GetWorkbooks();
book =books.Add(covOptional); //新建工作簿
sheets =book.GetSheets();
sheet =sheets.GetItem(COleVariant((short)1)); range=sheet.GetRange(COleVariant("A1"),COleVariant("A1")); CString cc; for(int i=0;i<m_cShowLog.m_ctrlShowLogInfor.get_Rows();i++)                      
{
//防止闪烁
m_cShowLog.m_ctrlShowLogInfor.SetRedraw(FALSE); m_cShowLog.m_ctrlShowLogInfor.put_Row(i); for(int j=1;j<m_cShowLog.m_ctrlShowLogInfor.get_Cols();j++)        
                          {
m_cShowLog.m_ctrlShowLogInfor.put_Col(j);
cc=m_cShowLog.m_ctrlShowLogInfor.get_TextMatrix(i,j);                     
range.SetItem(_variant_t((long)(i+1)),_variant_t((long)(j)),_variant_t(cc));
}
} col.AttachDispatch(sheet.GetUsedRange());
range.AttachDispatch(col.GetRows());
long iTatolRowNum= range.GetCount();
range.AttachDispatch(col.GetColumns());
long iTatolColNum = range.GetCount(); for(int i=0;i<=iTatolRowNum;i++)                        {
for(int j=1;j<=iTatolColNum;j++)               
{
range.GetEntireColumn();
range.AutoFit(); //font = range.GetFont();
//font.SetBold(COleVariant((short)TRUE));
}
} app.SetVisible(TRUE);                                        //设置Excel表可见
//app.SetUserControl(TRUE);                                     //设置Excel表可被操作 strFileName.Format("%s", dlg.GetPathName());  CString strTmp;
  strTmp = strFileName;
  book.SaveAs((COleVariant)strTmp,covOptional,covOptional,covOptional,covOptional,covOptional,0,\
  covOptional,covOptional,covOptional,covOptional,covOptional);
MessageBox("日志记录导出Excel成功","提示信息"); range.ReleaseDispatch(); 
sheet.ReleaseDispatch(); 
sheets.ReleaseDispatch(); 
book.ReleaseDispatch();
book.Close(covOptional,COleVariant(strFileName),covOptional);
books.ReleaseDispatch(); 
app.ReleaseDispatch(); 
books.Close();
app.Quit();
}

解决方案 »

  1.   

    把这两个放到函数体内调用看看::CoInitialize(NULL);
    ::CoUninitialize();
      

  2.   

    我也试了很久,好像是与app的生存周期有关。如果app是局部变量应该能正常退出。下面是没办法退出的一种方法:
    ShellExecute(NULL,"open","taskkill","/f /im EXCEL.EXE",NULL,SW_HIDE);
    Sleep(1000);
      

  3.   

    1.但想导出到指定路径下,不显示出来。
    app.SetVisible(false); //设置Excel表不可见2.  ::CoUninitialize();//取消COM组件的初始化
      

  4.   

            books.Close(); 
            objApp.Quit();
    objRange.ReleaseDispatch();
    objSheet.ReleaseDispatch();
    objSheets.ReleaseDispatch();
    objBook.ReleaseDispatch();
    objBooks.ReleaseDispatch();
    //退出及释放定义的Excel对象
    ::CoUninitialize();//取消COM组件的初始化
    ======
    试一下这样
      

  5.   

        你可以直接把FLEXGRID的数据保存成文件文件格式,每个数据用TAB空格或逗号来分隔,并把文件扩展名改成XLS或CSV的就行了.
        记住,一定要是TAB键的空格,不要自己加个" "这个空格(就是SPACE这个键),不然XECEL不识别数据间隔的,EXCEL只能识别TAB这个键
      

  6.   


    不行,excel后台程序还在
      

  7.   

    books =app.GetWorkbooks();
    book =books.Add(covOptional); //新建工作簿
    sheets =book.GetSheets();
    sheet =sheets.GetItem(COleVariant((short)1));range=sheet.GetRange(COleVariant("A1"),COleVariant("A1")); //表格起始位置CString cc;
    for(int i=0;i<m_cShowLog.m_ctrlShowLogInfor.get_Rows();i++)                       //行数: m_FlexGrid.GetRows()
    {
    //防止闪烁
    //m_cShowLog.m_ctrlShowLogInfor.SetRedraw(FALSE);
    m_cShowLog.m_ctrlShowLogInfor.put_Row(i);
    for(int j=1;j<m_cShowLog.m_ctrlShowLogInfor.get_Cols();j++)                   //列数: m_FlexGrid.GetCols()
    {
    m_cShowLog.m_ctrlShowLogInfor.put_Col(j);
    cc=m_cShowLog.m_ctrlShowLogInfor.get_TextMatrix(i,j);                     //获取FlexGrid1的单元格内容 range.SetItem(_variant_t((long)(i+1)),_variant_t((long)(j)),_variant_t(cc));
    }
    }col.AttachDispatch(sheet.GetUsedRange());
    range.AttachDispatch(col.GetRows());
    long iTatolRowNum= range.GetCount();
    range.AttachDispatch(col.GetColumns());
    long iTatolColNum = range.GetCount();for(int i=0;i<=iTatolRowNum;i++)                       //行数: m_FlexGrid.GetRows()
    {
    for(int j=1;j<=iTatolColNum;j++)                   //列数: m_FlexGrid.GetCols()
    {
    range.GetEntireColumn();
    range.AutoFit(); //自适应单元格内容长度
    //font = range.GetFont();
    //font.SetBold(COleVariant((short)TRUE));
    }
    }app.SetVisible(TRUE);                                        //设置Excel表可见
    app.SetUserControl(FALSE);                                    //设置Excel表可被操作*\ int iRet;
    CString temp;
    char mess[MAX_PATH];memset(mess, 0, MAX_PATH);
    ::GetModuleFileName(NULL, mess, MAX_PATH);
    str.Format("%s", mess);
    iRet = str.ReverseFind('\\');
    temp.Format("%s", str.Left(iRet));
    str = temp + "\\ExportLog";
    ::CreateDirectory(str, NULL);strFileName.Format(str+"\\%04d%02d%02d%02d%02d.xls", tm.GetYear(), tm.GetMonth(), tm.GetDay(), tm.GetHour(), tm.GetMinute());
    book.SaveAs((COleVariant)strFileName,covOptional,covOptional,covOptional,covOptional,covOptional,0,\
    covOptional,covOptional,covOptional,covOptional,covOptional);range.ReleaseDispatch(); 
    sheet.ReleaseDispatch(); 
    sheets.ReleaseDispatch(); 
    book.ReleaseDispatch(); 
    books.ReleaseDispatch(); 
    app.ReleaseDispatch(); 
    books.Close();
    app.Quit();str.Format("导出当前页日志成功: "+strFileName);
    MessageBox(str,"提示信息");