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赋值,程序运行中发现在多次调用该函数时,内存增加,直到应用程序退出时才会释放,不知道什么原因,高手帮忙看看?
{
_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赋值,程序运行中发现在多次调用该函数时,内存增加,直到应用程序退出时才会释放,不知道什么原因,高手帮忙看看?
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就退出去了
#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;
}