我爱电脑技术论坛's Archiver

bbs23 发表于 2008-3-29 11:00

Excel在.Net下驻留内存的解决方法

 这段时间在VS 2003 的WebForm 方式下对Excel 进行操作,遇到一个最为头疼的问题就是对Excel操作完毕后Excel不能够正常关闭,系统退出后,Excel总是驻留在内存中。但是这段代码放到WinForm的程序中又没有问题。在网上进行了查找也没有找到有效可行的办法。经过无数次的尝试,终于解决如下:
DL*V"rY*Z 8Ln$Z7?hh'k:J
  原来书写如下:1_:ERn[,t"a!r
,A4[i2](^8Fg7s)d
以下是引用片段:
jQZcm3V   private Excel.Application m_app;
nGB-bl(@   private Excel.Workbook m_workbook; I;bMIR#x+C
  this.m_app = new Excel.ApplicationClass(); Vh|p.tA"s2_ q;O0|
  this.m_app.DisplayAlerts = false; (B$H+HwD,N*QI3K2|p
  this.m_workbook = this.m_app.Workbooks.Open(sFilePath, Missing.Value,
4o(O:@3v*[;o;KH;M   Missing.Value, Missing.Value, Missing.Value,
v3Ir2[V5ERn)^o   Missing.Value, Missing.Value, Missing.Value,
]N6]8^*hx/]   Missing.Value, Missing.Value, Missing.Value,
2^ }$s \"@   Missing.Value, Missing.Value, Missing.Value,
\A&n4Q/|!vy_   Missing.Value );
*H&Jf,g;I ,o\M#t3M6XX H

2S!@/x k W^g9b\   修改后如下:
T!Io'Du0|,K "D(I2h:C%cMP
以下是引用片段:Yz V'`B;Z
  private Excel.Application m_app;
(qn.J1nL3_-k   private Excel.Workbooks m_workbooks;
,[S+g]D!Y   private Excel.Workbook m_workbook; 2z%q-jZ*pXyX
  this.m_app = new Excel.ApplicationClass();
R0p1~-S{   this.m_app.DisplayAlerts = false; -u'ti@f
  m_workbooks = this.m_app.Workbooks; 5M4tj"Jb.b\R
  this.m_workbook = this.m_workbooks.Open(sFilePath, Missing.Value, $n ~#uD,]4@1r tF(m
  Missing.Value, Missing.Value, Missing.Value, l|jA&CB8H b
  Missing.Value, Missing.Value, Missing.Value, 'f%OT-T/f:N D0WR
  Missing.Value, Missing.Value, Missing.Value,
Ypk!\{)K%F   Missing.Value, Missing.Value, Missing.Value, XMfDb
  Missing.Value );
%u*W&N6?%i+c#G:{ e7[qmZ:I^
3l7o"c_wd
  同样对Sheet的操作如下
ht6gw_&Po
LPl'H7_,H   修改前如下:b-ImZ)y*^8|/M
\1]saIj mb
以下是引用片段:y3q6h }tB
  Excel._Worksheet worksheet1 = null;
Z'i4j%vH   worksheet1 = (Excel._Worksheet) this.m_workbook.Worksheets.get_Item(sSheetName);
/hB(xq|!e   修改后如下: cg0Q?*Fs1x W_ n
  Excel.Sheets sheets = null ;
7s1E-Z_`*{z   Excel._Worksheet worksheet1 = null; m#O?)^]Z[
  sheets = this.m_workbook.Worksheets;
(}Y0a~;Zk?4O   worksheet1 = (Excel._Worksheet) sheets.get_Item(sSheetName); "X~E)Xx}

bUA1Nj7U'p;iu Ib6@!i&g!kQ
  发现区别了么?原来Workbooks,Worksheets这两个类没有被实例化就直接使用了,造成该类不能够被回收。最终造成Excel在内存的驻留。
|@~~tN3}
)G:Xm*Q v't   最终以如下方式释放。 以下是引用片段:;D)As4KK#G.cp;mW
  private void ReleaseAllRef(Object obj) 1B$D)l!iQi9mH8aw0O
  { Zl N/]2h"~j
  try MP-i)o:k9Z
  {
Y'x\CZQ   if (obj != null ) 0v;yBvu@
  { THvK,ev
  while (Marshal.ReleaseComObject(obj) > 1);
+B5s@Gn3Ih}dT   } /R*k;C,J/D(b
  }
IM(@!L$T*TH#p#?   finally
)OyaOFL+c   {
]m]}7s0V/q`   obj = null; (c6nvdipyW.eC5se
  }
? W-W^Gu!ru   } WLC(lJ| lV
  private void Release() /di,n7U)V
  { J!Q3?XJ W}
  if (m_app != null ) /dZ RT x+j'Q;r
  { 5}$E0\SUCkV
  m_app.Quit() ;
t.E&t } nT#d)M   }
nuJv5N&~9h   ReleaseAllRef(m_workbook) ; $}(o&T \7\0|:a
  m_workbook = null ; 1M1lb1gV#e
  ReleaseAllRef(m_workbooks) ;
"v*@~2]1i1E r   m_workbooks = null ;
K9V2yQF#]P u&K7E"a   ReleaseAllRef(m_app) ; 6A _\^%V3i
  m_app = null ;
`3J} P2T7_\'I   System.GC.Collect() ;
qUf(~*k/}aF   }

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.