解决了通过使用EXCEL.dll操作EXCEL文件的问题,格式也可以很好的控制,但是出现内存泄露的问题让我头疼不已,请高手指点迷津
多次使用我的数据导出功能后,机器就越用越慢,最后屏幕乱闪,我开始以为是病毒所产生,但是如果不使用该导出功能,机器正常,我想应该是系统 什么地方没有释放干净的原因,在进程中excel的进程已经关闭。请高手们指教一下,谢谢了
部分代码:
system.gc.collect()是和导出函数分开写的
Excel.Worksheet objSheet;
Excel.Application objExcel;
objExcel=new Excel.ApplicationClass();
objSheet=new Excel.WorksheetClass();
try
{
sFile=Server.MapPath(Request.ApplicationPath+"/download/TeaInfoBookBak2.db");
sTemplate=Server.MapPath(Request.ApplicationPath+"/download/TeaInfoBookBak1.xls");
objExcel.Visible=false;
objExcel.DisplayAlerts=false;
objExcel.SheetsInNewWorkbook=1;
objExcel.Workbooks.Add(sTemplate);
objSheet=(Excel.Worksheet)objExcel.Workbooks[1].Worksheets[1];
//插入固定数据
// objSheet.Cells.Select();
// objSheet.Cells.Copy(objSheet.Cells[2,13]);
FormatRange((Excel.Range)objSheet.Cells[2,2],1,9);
// ((Excel.Range)objSheet.Cells[2,2]).Copy(objSheet.Cells[2,2]);
objSheet.Cells[2,2]=DateTime.Now.ToShortDateString()+" "+DateTime.Now.ToShortTimeString();
//出入活动报表数据
int RowNo=4,ColNo=1;
for(RowNo=4;RowNo<=dTable.Rows.Count-1+4;RowNo++)
{
for(ColNo=1;ColNo<=strField.Length;ColNo++)
{
string dd=dTable.Rows[RowNo-4][strField[ColNo-1]].ToString();
// objSheet.Select(objSheet.Cells[RowNo,ColNo]);
((Excel.Range)objSheet.Cells[4,13]).Copy(objSheet.Cells[RowNo,ColNo]);
objSheet.Cells[RowNo,ColNo]=dd+" ";
}
}
objExcel.Workbooks[1].SaveCopyAs(sFile);
}
catch(Exception e)
{
throw new Exception(e.Message.ToString());
}
finally
{
if (objExcel!= null)
{
// int generation = 0;
// objExcel.UserControl = false;
//如果您将 DisplayAlerts 属性设置为 False,则系统不会提示您保存任何未保存的数据。
//_xlApp.DisplayAlerts = false;
objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet);
// generation = System.GC.GetGeneration(objExcel);
objExcel = null;
objSheet=null;
}
问题点数:100、回复次数:10Top
1 楼chaobeyond(阿漠)回复于 2005-11-01 16:45:41 得分 50
代码好长,看起来费力..
调用这个方法试一下:
private void KillExcelProceed()
{
int ProceedingCount = 0;
System.Diagnostics.Process[] ExcelProcesses;
ExcelProcesses = System.Diagnostics.Process.GetProcessesByName("EXCEL");
foreach(System.Diagnostics.Process IsProcedding in ExcelProcesses)
{
if(IsProcedding.ProcessName=="EXCEL")
{
ProceedingCount += 1;
}
}
if(ProceedingCount > 0)
{
DialogResult result;
result=MessageBox.Show("发现系统中有Excel进程,要关闭所有Excel进程吗?","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Information);
if(result==DialogResult.Yes)
{
foreach(System.Diagnostics.Process myProcess in ExcelProcesses)
{
myProcess.Kill();
}
}
}
}Top
2 楼activeandbadboy(动感男孩)回复于 2005-11-01 16:52:01 得分 0
这就是杀所有进程马Top
3 楼activeandbadboy(动感男孩)回复于 2005-11-01 16:58:14 得分 0
GetProcessesByName汉书包错啊。。。。。系统说拒绝访问,,该怎么办啊Top
4 楼activeandbadboy(动感男孩)回复于 2005-11-01 17:02:34 得分 0
没有人知道这是为什么吗.....已经困扰我好久了,,清高手指点一下阿。。。。。。Top
5 楼smallMage(小马哥)回复于 2005-11-01 17:07:05 得分 30
http://dotnet.aspx.ccTop
6 楼feiyun0112(http://feiyun0112.cnblogs.com/)回复于 2005-11-01 17:21:16 得分 10
gc搜集垃圾Top
7 楼activeandbadboy(动感男孩)回复于 2005-11-02 10:22:16 得分 0
没有用,我是用料回收垃圾的,但是没有用,进程里面没有,但是系统要崩溃Top
8 楼jxufewbt(我的目标是5星)回复于 2005-11-02 10:49:30 得分 5
也许是你的机器中毒了Top
9 楼cuike519(I will be back!)回复于 2005-11-02 11:38:24 得分 5
请参考:http://www.codeproject.com/vb/net/ReleaseExcelObject.aspTop
10 楼activeandbadboy(动感男孩)回复于 2005-11-02 13:30:58 得分 0
机器没有中毒,,,我换多中杀毒软件均未杀出病毒,,,如果不使用数据导出,系统可以很好用Top




