void CExcelOpeDlg::TransUpData(Range &desRge, Range &sourceRge, int desSheetIndex, int ZoneIndex)
{
_variant_t OrderNum, PeopleNum;
//读取数据
OrderNum = sourceRge.GetItem(_variant_t((long)m_UpDataAddupRow),_variant_t((long)2));
PeopleNum = sourceRge.GetItem(_variant_t((long)m_UpDataAddupRow),_variant_t((long)3)); if (0 == desSheetIndex)
{
desRge.SetItem(_variant_t((long)(m_OrderNumLastYWRow + 1)), _variant_t((long)(ZoneIndex + 1)), OrderNum);
desRge.SetItem(_variant_t((long)(m_OrderNumLastYWRow + 2)), _variant_t((long)(ZoneIndex + 1)), PeopleNum);
}
else if (1 == desSheetIndex)
{
desRge.SetItem(_variant_t((long)(m_DetailedTableLastYWRow + 1)), _variant_t((long)(ZoneIndex * 2)), OrderNum);
desRge.SetItem(_variant_t((long)(m_DetailedTableLastYWRow + 1)), _variant_t((long)(ZoneIndex * 2 + 1)), PeopleNum);
}
}这个函数把sourceRge中的数据给desRge赋值,程序运行中发现在多次调用该函数时,内存增加,直到应用程序退出时才会释放,不知道什么原因,高手帮忙看看?

解决方案 »

  1.   

    程序运行时,发现 excel.exe 与 我的应用程序 内存使用一直都在增加。若把该函数调用注释掉,则不会这个样子。从excel.exe传过来的variant数据我需要释放吗?
      

  2.   

    你的sourceRge对象在每次用完后应该是重新分配的,可能不是这个函数问题,再查一下你的上层的关sourcrRge代码吧
      

  3.   

    std::string Info;
    Info = "正在检测参数...";
    ShowInfo(Info); m_bTrans = true;
    m_bCanTrans = true;
    OnButtonTest();
    if (!m_bCanTrans)
    return;
    m_bTrans = false; _Application excelApp,sourceExcelApp; 
    Workbooks books,sourceBooks; 
    _Workbook sourceBook, desBook; 
    Sheets sourceSheets, desSheets;   
    _Worksheet sourceSheet, desSheet0, desSheet1, desSheet2;  
    Range sourceRge, desRge0, desRge1, desRge2;  if (0 == excelApp.CreateDispatch(_T("Excel.Application"),NULL))
    {
    AfxMessageBox("创建Excel服务失败!"); 
    exit(1); 
    }

    if (0 == sourceExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
    {
    AfxMessageBox("创建Excel服务失败!"); 
    exit(1); 
    } books.AttachDispatch(excelApp.GetWorkbooks(),TRUE); 
    sourceBooks.AttachDispatch(sourceExcelApp.GetWorkbooks(),TRUE); 
    //从模板文件生成要填的数据文件
    desBook.AttachDispatch(books.Add(_variant_t(m_strTemplateFile.operator LPCTSTR())));  desSheets.AttachDispatch(desBook.GetWorksheets(),TRUE); desSheet0.AttachDispatch(desSheets.GetItem(_variant_t(SHEET0)),TRUE);
    desSheet1.AttachDispatch(desSheets.GetItem(_variant_t(SHEET1)),TRUE);
    desSheet2.AttachDispatch(desSheets.GetItem(_variant_t(SHEET2)),TRUE);
    desRge0.AttachDispatch(desSheet0.GetCells(),TRUE);
    desRge1.AttachDispatch(desSheet1.GetCells(),TRUE);
    desRge2.AttachDispatch(desSheet2.GetCells(),TRUE);

    char Data[MAXFILEPATHLEN];
    memset(Data,0,sizeof(Data));
    sprintf(Data,"%d%02d%02d",m_TransFileTime.GetYear(),m_TransFileTime.GetMonth(),
    m_TransFileTime.GetDay());

    // SHEET0 "点播量"
    // SHEET1 "明细总表"
    for(int index = 0; index < m_ZoneVec.size(); index++)
    {

    CString File,FileMainPart,ZoneDataFileSheet;
    FileMainPart = m_strSourceZoneFileDir;
    FileMainPart += m_ZoneVec.at(index).c_str();
    FileMainPart += Data;

    ZoneDataFileSheet = m_ZoneVec.at(index).c_str();
    ZoneDataFileSheet += Data;
    ZoneDataFileSheet += UPFILEPART; File = FileMainPart;
    File += UPFILEPART;
    File += ".xls";

    Info = File.operator LPCTSTR();
    if (IsFileExist(File))
    {
    Info += " 读取数据...";
    ShowInfo(Info);
    //处理上行数据转移

    //打开文件
    sourceBook.AttachDispatch(sourceBooks.Add(_variant_t(File.operator LPCTSTR())),TRUE);
    sourceSheets.AttachDispatch(sourceBook.GetWorksheets(),TRUE);
    sourceSheet.AttachDispatch(sourceSheets.GetItem(_variant_t(ZoneDataFileSheet.operator LPCTSTR())),TRUE);
    sourceRge = sourceSheet.GetCells();
             // 这儿 在 excel 之间数据转移
    // TransUpData(desRge0,sourceRge,0,index + 1);
    // TransUpData(desRge1,sourceRge,1,index + 1);

    //释放
    sourceRge.ReleaseDispatch();
    sourceSheet.ReleaseDispatch();
    sourceSheets.ReleaseDispatch();
    sourceBook.Close(_variant_t(false),_variant_t(""),_variant_t(false));
    sourceBook.ReleaseDispatch();
    sourceBooks.Close();
    }
    else
    {
    Info += " 不存在,跳过...";
    ShowInfo(Info);
    }

    ZoneDataFileSheet = m_ZoneVec.at(index).c_str();
    ZoneDataFileSheet += Data;
    ZoneDataFileSheet += DOWNFILEPART;

    File = FileMainPart;
    File += DOWNFILEPART;
    File += ".xls";

    Info = File.operator LPCTSTR();
    if (IsFileExist(File))
    {
    Info += " 读取数据...";
    ShowInfo(Info);
    //处理下行数据转移 //打开文件
    sourceBook.AttachDispatch(sourceBooks.Add(_variant_t(File.operator LPCTSTR())),TRUE);
    sourceSheets.AttachDispatch(sourceBook.GetWorksheets(),TRUE);
    sourceSheet.AttachDispatch(sourceSheets.GetItem(_variant_t(ZoneDataFileSheet.operator LPCTSTR())),TRUE);
    sourceRge = sourceSheet.GetCells();         // 这儿 在 excel 之间数据转移
    // TransDownData(desRge0,sourceRge,0,index + 1);
    // TransDownData(desRge1,sourceRge,1,index + 1); //释放
    sourceRge.ReleaseDispatch();
    sourceSheet.ReleaseDispatch();
    sourceSheets.ReleaseDispatch();
    sourceBook.Close(_variant_t(false),_variant_t(""),_variant_t(false));
    sourceBook.ReleaseDispatch();
    sourceBooks.Close();
    }
    else
    {
    Info += " 不存在,跳过...";
    ShowInfo(Info);
    }
    } // SHEET2 "服务类型小时"
    CString File,DataFileSheet;
    memset(Data,0,sizeof(Data));
    sprintf(Data,"%d-%02d-%02d",m_TransFileTime.GetYear(),m_TransFileTime.GetMonth(),
    m_TransFileTime.GetDay());
    File = m_strSourceZoneFileDir;
    File += Data;
    File += SHEET2;
    File += ".xls"; DataFileSheet = Data;
    DataFileSheet += SHEET2; Info = File.operator LPCTSTR();
    if (IsFileExist(File))
    {
    Info += " 读取数据...";
    ShowInfo(Info);
    //处理下行数据转移

    //打开文件
    sourceBook.AttachDispatch(sourceBooks.Add(_variant_t(File.operator LPCTSTR())),TRUE);
    sourceSheets.AttachDispatch(sourceBook.GetWorksheets(),TRUE);
    sourceSheet.AttachDispatch(sourceSheets.GetItem(_variant_t(DataFileSheet.operator LPCTSTR())),TRUE);
    sourceRge = sourceSheet.GetCells();// 这儿 在 excel 之间数据转移
    // TransServerTypeHourData(desRge2,sourceRge);

    //释放
    sourceRge.ReleaseDispatch();
    sourceSheet.ReleaseDispatch();
    sourceSheets.ReleaseDispatch();
    sourceBook.Close(_variant_t(false),_variant_t(""),_variant_t(false));
    sourceBook.ReleaseDispatch();
    sourceBooks.Close();
    }
    else
    {
    Info += " 不存在,跳过...";
    ShowInfo(Info);
    }
    CString NewFile = m_strNewFileDir;
    NewFile += m_strNewFileName; Info = NewFile.operator LPCTSTR();
    Info += " 正在生成...";
    ShowInfo(Info); desBook.SaveCopyAs(_variant_t(NewFile.operator LPCTSTR())); Info = "数据转移完成!";
    ShowInfo(Info);
    desRge0.ReleaseDispatch();
    desRge1.ReleaseDispatch();
    desRge2.ReleaseDispatch();

    desSheet0.ReleaseDispatch();
    desSheet1.ReleaseDispatch();
    desSheet2.ReleaseDispatch(); desSheets.ReleaseDispatch(); desBook.Close(_variant_t(false),_variant_t(""),_variant_t(false));
    desBook.ReleaseDispatch();

    books.Close();
    books.ReleaseDispatch();// char c[100];
    // memset(c,0,sizeof(c));
    // sprintf(c,"%d",sourceBooks.GetCount());
    // MessageBox(c); sourceBooks.ReleaseDispatch(); excelApp.Quit();
    excelApp.ReleaseDispatch(); sourceExcelApp.Quit();
    sourceExcelApp.ReleaseDispatch(); 代码就是这样子的
     
     当我隐去该函数调用,运行到上面最后,excel.exe就退出去了
      

  4.   

    9494,#import进来后写可以精炼许多。
      

  5.   

    #include <ole2.h>
    #include <stdio.h>
    #pragma warning (disable:4146 4192 4786 4081)
    #define USE_OFFICEXP 1#ifdef USE_OFFICEXP
    #import "C:\Program Files\Common Files\Microsoft Shared\Office10\MSO.DLL" 
    #import "c:\\Program Files\\Common Files\Microsoft Shared\\VBA\VBA6\VBE6EXT.olb" 
    #import "c:\Program Files\Microsoft Office\Office10\MSWORD.olb" rename("ExitWindows","ExitWindowsEx")
    #import "c:\Program Files\Microsoft Office\Office10\excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
             rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
    #else
    #import "c:\Program Files\Microsoft Office\Office\MSO9.dll"
    #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" no_namespace 
    #import "c:\Program Files\Microsoft Office\Office\MSWORD9.OLB" rename("ExitWindows","_ExitWindows")
    #import "c:\Program Files\Microsoft Office\Office\excel9.olb" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
             rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
    #endif
    int main(int argc, char* argv[])
    {
    int i = Excel::xlContinuous;
    VARIANT varItem;
    varItem.vt = VT_I4;
    varItem.intVal = 1;
        ::CoInitialize(NULL);
        CLSID clsid;
    CLSIDFromProgID(L"Excel.Application", &clsid); 
    Excel::_ApplicationPtr pApp;
    pApp .CreateInstance (clsid,NULL);
    pApp ->PutVisible (0,VARIANT_TRUE);
    Excel::_WorkbookPtr pWorkbook = pApp ->GetWorkbooks () ->Add ();
    Excel::_WorksheetPtr    pSheet    = pWorkbook ->GetWorksheets ()  ->GetItem (varItem);
    Excel::RangePtr     pRange    = pSheet ->GetUsedRange(0);
    int iColCnt = pRange ->GetColumns() ->GetCount();
    printf("used columns is %d\n",iColCnt);
    int iRowCnt = pRange ->GetRows() ->GetCount();
    printf("used rows  is %d\n",iRowCnt);
    pRange = pSheet ->GetRange(OLESTR("A1"));
    pRange ->Value2     = OLESTR("SOME");
    Excel::InteriorPtr  pInterior= pRange ->GetInterior ();
    varItem.intVal = 0xff0000;
    pInterior ->PutColor (varItem);
    pSheet ->PrintPreview ();    ::CoUninitialize();
        return 0;
    }