我爱电脑技术论坛's Archiver

bbs23 发表于 2008-4-5 09:50

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

 这段时间在VS 2003 的WebForm 方式下对Excel 进行操作,遇到一个最为头疼的问题就是对Excel操作完毕后Excel不能够正常关闭,系统退出后,Excel总是驻留在内存中。但是这段代码放到WinForm的程序中又没有问题。在网上进行了查找也没有找到有效可行的办法。经过无数次的尝试,终于解决如下:
K"n)s a;W]{Ls
Q.RA(d,wB$V*t,K   原来书写如下:9wh%p2a*x8?9}

?@W@J"] PM 以下是引用片段:
+J(w8e%Md0Ao;L   private Excel.Application m_app; t!\ K$t7IS/v
  private Excel.Workbook m_workbook; 3w|P)`*ti4I
  this.m_app = new Excel.ApplicationClass();
U)o9d f*xB   this.m_app.DisplayAlerts = false;
0YNKG {A^   this.m_workbook = this.m_app.Workbooks.Open(sFilePath, Missing.Value,
t.PaEH j\   Missing.Value, Missing.Value, Missing.Value,
DLq%`%ts   Missing.Value, Missing.Value, Missing.Value, )_.j$fB7V_
  Missing.Value, Missing.Value, Missing.Value,
(P/JP~[0H"|p5R   Missing.Value, Missing.Value, Missing.Value, -Q$@2zG5q1} HO!N
  Missing.Value ); 6N5B9U*c"q
3O?D@F.j
(C,CL-fo8R(W\n
  修改后如下:Ux3F1\[+yirfX

6v'iy h@Q 以下是引用片段:0NZ#i}Lq\F
  private Excel.Application m_app; (g7rU/p:z9x
  private Excel.Workbooks m_workbooks; k&v \9b:G} B
  private Excel.Workbook m_workbook; hter^ uD'm+I)\
  this.m_app = new Excel.ApplicationClass(); )b}BaP6lJ
  this.m_app.DisplayAlerts = false; S!@9@%JU)itu#x]
  m_workbooks = this.m_app.Workbooks;
M9D(L fP;vH$P%y%KeC   this.m_workbook = this.m_workbooks.Open(sFilePath, Missing.Value, pcv%Go
  Missing.Value, Missing.Value, Missing.Value, fsW-Y V0rQD:Gu1t
  Missing.Value, Missing.Value, Missing.Value,
+Ps&o)p Og$@)H3@][   Missing.Value, Missing.Value, Missing.Value,
W-wXj#bK!HL(Cw   Missing.Value, Missing.Value, Missing.Value, wXWB:`
  Missing.Value );
B y}aE+j.A#sa V&_1w o p g[.q@Pl gu

a+rF7`lR'ZZ   同样对Sheet的操作如下
@U,^ v x` q
!N_4D*D&_Q$a6X   修改前如下:E$B?t)u4~
R8Z'L:W*W |6kZs m\3Fg
以下是引用片段:@@x;H8L5`|
  Excel._Worksheet worksheet1 = null; \#~t&D \(m@/r L:o3Q!h&L.i
  worksheet1 = (Excel._Worksheet) this.m_workbook.Worksheets.get_Item(sSheetName); 'U2y-y9yDvg3d},Q
  修改后如下:
d'Y]mKJV   Excel.Sheets sheets = null ;
%~Wip5j.j   Excel._Worksheet worksheet1 = null; E}9vm!|,M
  sheets = this.m_workbook.Worksheets; 0W{,j7SO
  worksheet1 = (Excel._Worksheet) sheets.get_Item(sSheetName); M5Mz M!u"|V*p+u
.VQq:qX1Gs
9k7Ot,_+g9L
  发现区别了么?原来Workbooks,Worksheets这两个类没有被实例化就直接使用了,造成该类不能够被回收。最终造成Excel在内存的驻留。
*S&`S8pAb$a"I
]-Bzdy/O&{v   最终以如下方式释放。 以下是引用片段:
%vz'm\G*R   private void ReleaseAllRef(Object obj)
Z)D3~ axH Q8?   {
X` r u_:vFN m0n   try 0ANp4t g4]@
  {
@x c`o"L H   if (obj != null ) %O\(b rC F8bS8] C9^
  {
-S(CSo]2cwB   while (Marshal.ReleaseComObject(obj) > 1);
"Z#W dAV_&T   }
j5T7@zt   } %do@ t?R
  finally 2m&\:k,lya W7]B6~ m
  {
+lt'Y$]t   obj = null; 0S9Jrlg8m
  }
7@r6R5|-g3DxuI&W   } RB6m~;Ty+o(Y
  private void Release() (w:p jQo I
  { 6J;dj/G(jlc
  if (m_app != null ) U.Tx-kc[nJ]
  { d&Yo1k#?A/S I i
  m_app.Quit() ;
Rc4w(s F oc   }
"n-Jd/{d)d8\(pRn(}   ReleaseAllRef(m_workbook) ;
nBx-c5w j   m_workbook = null ;
B\3Hw*s._4G   ReleaseAllRef(m_workbooks) ; V#Q"_+`1ng ~
  m_workbooks = null ; C6R0Zv#J5v
  ReleaseAllRef(m_app) ;
N[u,[R*d   m_app = null ; 1BV)J1Ts e4M
  System.GC.Collect() ;
+D&P b$U/Ar;p` V*N   }

页: [1]
   

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