wangchao.org
添加收藏 | 博客
 
购物视频论坛IT业界自然风光美女图片王朝网络小游戏BT下载生活百科编程设计手机图铃小说
 
笑话 | 水库 | 娱乐 | 体育 | 英语 | 宠物 | 美食 | 旅游 | 养生 | 手机 | 数码 | 汽车 | 珠宝 | 美容 | 装修 | 厨房 | 科普 | 动物 | 植物 | 影音 | 百科 | 知道 | 词典
  
 
 您好! 您现在位于: 王朝网络 → 编程设计 → 《Excel在.Net下驻留内存的解决方法返回上一页 
 
1楼 

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

  网上购物、在线购物、购物搜索 欢迎光临本站购买图书、影视、音乐、数码、百货,手机等商品。

  这段时间在VS 2003 的WebForm 方式下对Excel 进行操作,遇到一个最为头疼的问题就是对Excel操作完毕后Excel不能够正常关闭,系统退出后,Excel总是驻留在内存中。但是这段代码放到WinForm的程序中又没有问题。在网上进行了查找也没有找到有效可行的办法。经过无数次的尝试,终于解决如下:
  原来书写如下:
  以下是引用片段:
  private Excel.Application m_app;
  private Excel.Workbook m_workbook;
  this.m_app = new Excel.ApplicationClass();
  this.m_app.DisplayAlerts = false;
  this.m_workbook = this.m_app.Workbooks.Open(sFilePath, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value );
  修改后如下:
  以下是引用片段:
  private Excel.Application m_app;
  private Excel.Workbooks m_workbooks;
  private Excel.Workbook m_workbook;
  this.m_app = new Excel.ApplicationClass();
  this.m_app.DisplayAlerts = false;
  m_workbooks = this.m_app.Workbooks;
  this.m_workbook = this.m_workbooks.Open(sFilePath, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value, Missing.Value, Missing.Value,
  Missing.Value );
  同样对Sheet的操作如下
  修改前如下:
  以下是引用片段:
  Excel._Worksheet worksheet1 = null;
  worksheet1 = (Excel._Worksheet) this.m_workbook.Worksheets.get_Item(sSheetName);
  修改后如下:
  Excel.Sheets sheets = null ;
  Excel._Worksheet worksheet1 = null;
  sheets = this.m_workbook.Worksheets;
  worksheet1 = (Excel._Worksheet) sheets.get_Item(sSheetName);
  发现区别了么?原来Workbooks,Worksheets这两个类没有被实例化就直接使用了,造成该类不能够被回收。最终造成Excel在内存的驻留。
  最终以如下方式释放。 以下是引用片段:
  private void ReleaseAllRef(Object obj)
  {
  try
  {
  if (obj != null )
  {
  while (Marshal.ReleaseComObject(obj) > 1);
  }
  }
  finally
  {
  obj = null;
  }
  }
  private void Release()
  {
  if (m_app != null )
  {
  m_app.Quit() ;
  }
  ReleaseAllRef(m_workbook) ;
  m_workbook = null ;
  ReleaseAllRef(m_workbooks) ;
  m_workbooks = null ;
  ReleaseAllRef(m_app) ;
  m_app = null ;
  System.GC.Collect() ;
  }

  这段时间在VS 2003 的WebForm 方式下对Excel 进行操作,遇到一个最为头疼的问题就是对Excel操作完毕后Excel不能够正常关闭,系统退出后,Excel总是驻留在内存中。但是这段代码放到WinForm的程序中又没有问题。在网上进行了查找也没有找到有效可行的办法。经过无数次的尝试,终于解决如下:   原来书写如下: 以下是引用片段:   private Excel.Application m_app;   private Excel.Workbook m_workbook;   this.m_app = new Excel.ApplicationClass();   this.m_app.DisplayAlerts = false;   this.m_workbook = this.m_app.Workbooks.Open(sFilePath, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value );   修改后如下: 以下是引用片段:   private Excel.Application m_app;   private Excel.Workbooks m_workbooks;   private Excel.Workbook m_workbook;   this.m_app = new Excel.ApplicationClass();   this.m_app.DisplayAlerts = false;   m_workbooks = this.m_app.Workbooks;   this.m_workbook = this.m_workbooks.Open(sFilePath, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value, Missing.Value, Missing.Value,   Missing.Value );   同样对Sheet的操作如下   修改前如下: 以下是引用片段:   Excel._Worksheet worksheet1 = null;   worksheet1 = (Excel._Worksheet) this.m_workbook.Worksheets.get_Item(sSheetName);   修改后如下:   Excel.Sheets sheets = null ;   Excel._Worksheet worksheet1 = null;   sheets = this.m_workbook.Worksheets;   worksheet1 = (Excel._Worksheet) sheets.get_Item(sSheetName);   发现区别了么?原来Workbooks,Worksheets这两个类没有被实例化就直接使用了,造成该类不能够被回收。最终造成Excel在内存的驻留。   最终以如下方式释放。 以下是引用片段:   private void ReleaseAllRef(Object obj)   {   try   {   if (obj != null )   {   while (Marshal.ReleaseComObject(obj) > 1);   }   }   finally   {   obj = null;   }   }   private void Release()   {   if (m_app != null )   {   m_app.Quit() ;   }   ReleaseAllRef(m_workbook) ;   m_workbook = null ;   ReleaseAllRef(m_workbooks) ;   m_workbooks = null ;   ReleaseAllRef(m_app) ;   m_app = null ;   System.GC.Collect() ;   }

 
标签: Excel  Net  内存  解决方法  驻留  
 
您可以将本页贴到其他网站
UBB代码HTML代码
 
 
 
 
 
 
 更多内容
 ·分析及解决SQLServer死锁问题 ·MS SQL Server查询优化方法 ·ASP与存储过程实践(实例) ·MySQL的AUTO_INCREMENT
 ·C#中接口的深入浅出 ·SQL SERVER数据库开发之存储过程 ·网站繁简转换解决方案--ASP,JSP, ·利用PHOTOSHOP又一招:强烈对比调
 ·Windows Vista下如何去除QQ和MSN ·用QQ看股票 “股市行情资讯”面板 ·Mysql 数据库字符集转换及版本升 ·注意那些容易被忽略的SQL注入技巧
 ·不需xp_cmdshell支持在有注入漏洞 ·SQL Server 存储过程的分页方案比 ·巧用Photoshop做甲壳虫卡通动画 ·Excel 2007筛选唯一值或删除重复
 ·QQ蜂鸟支持外部插件 日历等组件随 ·用暴风影音让影片的声音再大一点 ·网页标准化制作:CSS的超级技巧大 ·推荐一些所谓的CSS的“顶级”技巧
 ·C#实现Socket传输简单数据 ·在C#中运用SQLDMO备份和恢复Micr ·php调用存储过程返回结果集,解决 ·JSP/Servlet的URL重定向
 
 
最新评论  点此查看所有评论
 
 
 
 
发表评论(支持UBB码)


验证码:  
 
 
 
© 2005- 王朝网络 版权所有