真·VB.NET彻底释放Interop.Excel对象

这篇具有很好参考价值的文章主要介绍了真·VB.NET彻底释放Interop.Excel对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用 Microsoft.Office.Interop.Excel 虽然有速度慢的缺点;但是作为自带引用,兼容性最好,而且是COM对象模型也很熟悉(Excel里直接录个宏,很方便把VBA代码转成VB.NET)。所以处理几百上千条的小数据时还是很方便的。

Microsoft.Office.Interop.Excel 用得不多的最大问题其实就是拿简单例子可以正确释放Excel,做了大量操作后却发现在任务管理器中依然有多余Excel进程存在。

问题原因当然是COM对象映射到Interop交互对象之后,.NET下的交互对象释放次序不符合COM对象预期,导致不能正确释放。比如

Dim xlApp New Excel.Application() With {.Visible = False}
Dim xlWorkbooks As Excel.Workbooks = xlApp.Workbooks
Dim xlWorkbook As Excel.Workbook = xlWorkbooks.Open("...")

Dim value As Object = xlWorkbook.Sheets(1).Cells(1,1).Value

xlWorkbook.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook)
xlWorkbook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbooks)
xlWorkbooks = Nothing
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
xlApp = Nothing
System.GC.Collect()

中间取value这行代码看起来很正常,没有保留任何交互对象。其实在整个对象访问路径上隐式使用了以下交互对象,要靠GC来释放(通常是延后的————即调用Close()时交互对象未释放、工作簿关闭不了,之后的Quit()Excel不会退出),

xlWorkbook.Sheets 'Excel.Sheets
xlWorkbook.Sheets(1) 'Excel.Worksheet
xlWorkbook.Sheets(1).Cells 'Excel.Range
xlWorkbook.Sheets(1).Cells(1,1) 'Excel.Range

要做到正确释放,要把这些交互对象全部在Close()前释放。为了方便使用,把 Excel.ApplicationExcel.Workbook 封装在类中,用 IDisposable 接口确保释放。用类似下面的属性封装访问

    Public Property CellValue(sheetIndex As Object, rowNo As Integer, colNo As Integer) As Object
        Get
            Dim xlSheets As Excel.Sheets = m_xlWorkbook.Sheets
            Dim xlSheet As Excel.Worksheet = xlSheets.Item(sheetIndex)
            Dim xlCells As Excel.Range = xlSheet.Cells
            Dim xlCell As Excel.Range = xlCells.Item(rowNo, colNo)
            Dim value As Object = xlCell.Value
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCell)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlCells)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets)
            System.GC.Collect(0)
            Return value
        End Get
        Set(value As Object)
            ' 同理所有交互对象保留变量、释放
        End Set
    End Property

上面的属性是通过行号、列号访问单元value;如果需要通过A1格式访问单元又要定义属性;如果需要访问单元text也要单独定义属性。
总之全部封装好后,读写完Excel文件后就能正确释放,不再有多余Excel进程残留。文章来源地址https://www.toymoban.com/news/detail-652670.html

到了这里,关于真·VB.NET彻底释放Interop.Excel对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .Net NPOI Excel 导出

    最终效果图      环境:Revit,WPF,NPOI 2.5.6,.Net Framework 4.7.2 右击项目引用,选择 \\\"管理NuGet程序包\\\",在浏览搜索 NPOI ,选择版本(我这里是2.5.6),安装       安装成功后,引用里会出现这四个引用(NPOI,NPOI.OOXML,NPOI.OpenXml4Net,NPOI.OpenXmlFormats) 在NuGet程序包里会多出来这

    2024年02月07日
    浏览(52)
  • .NET6导入导出Excel

    一、使用NPOI导出Excel //引入NPOI包 HTML JS C# 二、使用NPOI导入Excel HTML JS C# 控制器代码 添加ExcelHelper类 添加Extensions类 添加实体类UserEntity,要跟Excel的列名一致 Excel模板 实现效果

    2024年02月12日
    浏览(41)
  • .NET CORE Api 上传excel解析并生成错误excel下载

    写在前面的话:          【对外承接app API开发、网站建设、系统开发,有偿提供帮助,联系方式于文章最下方 】 因业务调整,不再需要生成错误无excel下载,所以先保存代码,回头再重新编辑 model部分 参考文档 1、Asp.NET Core 导出数据到 Excel 文件 - 码农教程 2、.net5下使用

    2024年02月11日
    浏览(43)
  • .NET Core 实现Excel的导入导出

    目录 前言 NPOI简介 一、安装相对应的程序包 1.1、在 “管理NuGet程序包” 中的浏览搜索:“NPOI” 二、新建Excel帮助类 三、调用 3.1、增加一个“keywords”模型类,用作导出 3.2、添加一个控制器 3.3、编写导入导出的控制器代码 3.3.1、重写“Close”函数 3.3.2、添加控制器代码 3.

    2024年02月08日
    浏览(37)
  • .NET Core NPOI导出复杂Excel

    NPOI GitHub源码地址: GitHub - tonyqus/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM+, no interop. 版本说明: NPOI 2.4.1 (注意不同版本可能使用的姿势有点小差别) 程序包管理器控制台输入一下命令安装: 1 Install-Package NPOI -Version 2.4.1 通过NuGet管理解决方

    2024年02月03日
    浏览(43)
  • c# 使用Microsoft.Office.Interop.Excel 对Excel操作

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 Microsoft.Office.Interop.Excel的读取,保存,内容写入和打印。 提示:以下是本篇文章正文内容,下面案例可供参考     首先于Proj

    2024年02月03日
    浏览(42)
  • 三种方法让.NET轻松实现Excel转PDF

    前一段时间有网友问Excel转pdf怎么转pdf,小编帮他实现了一个,方法是使用EPPlus和PdfSharp组件实现,由于依赖OfficeOpenXml他也没有用上,后来小编又实现了二种不依赖OfficeOpenXml的方法。本文将介绍这三种方法实现Excel转pdf。 一、EPPlus和PdfSharp组件实现 逻辑是先将Excel内容转换为

    2024年02月08日
    浏览(47)
  • .NET Core6.0使用NPOI导入导出Excel

    一、使用NPOI导出Excel //引入NPOI包 HTML JS C# 二、使用NPOI导入Excel HTML JS C# 控制器代码 添加ExcelHelper类 添加Extensions类 添加实体类UserEntity,要跟Excel的列名一致 Excel模板 实现效果

    2024年02月12日
    浏览(44)
  • C# .NET读取和写入Excel表数据(手把手教)

    (1)首先在程序:“引用”右键--点击“管理NuGet程序包” (我这里是已经引入过了,所以会显示引用中有NPOI)   (2)在“浏览”处搜索“NPOI”,选择适当版本安装(需要联网)   (3)在程序中引入相应的命名空间,编写读取excel表格的封装代码(万能) (4)调用上述读取

    2024年02月11日
    浏览(46)
  • 关于使用Microsoft.Office.Interop.Excel.dll来读写Excel表格的问题

    小公司,使用打卡机进行考勤,输出的是一张Excel表格,每个月看到前台妹子都要辛辛苦苦地统计Excel表格每个员工迟到的时间,于是想着写一个自动计算迟到分钟的小程序。 参照这几篇比较好的文章按部就班地做:导出Excel文件 、其它方法。 没想到刚开始写就遇到一个大坑

    2024年02月16日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包