当前位置: 首页 > news >正文

淄博网站制作设计定制广州安全教育平台登录账号登录入口

淄博网站制作设计定制,广州安全教育平台登录账号登录入口,网页视频怎么下载插件,打鱼网站建设使用 Microsoft.Office.Interop.Excel 虽然有速度慢的缺点;但是作为自带引用,兼容性最好,而且是COM对象模型也很熟悉(Excel里直接录个宏,很方便把VBA代码转成VB.NET)。所以处理几百上千条的小数据时还是很方便的。 而 Microsoft.…

使用 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).ValuexlWorkbook.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 ObjectGetDim xlSheets As Excel.Sheets = m_xlWorkbook.SheetsDim xlSheet As Excel.Worksheet = xlSheets.Item(sheetIndex)Dim xlCells As Excel.Range = xlSheet.CellsDim xlCell As Excel.Range = xlCells.Item(rowNo, colNo)Dim value As Object = xlCell.ValueSystem.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 valueEnd GetSet(value As Object)' 同理所有交互对象保留变量、释放End SetEnd Property

上面的属性是通过行号、列号访问单元value;如果需要通过A1格式访问单元又要定义属性;如果需要访问单元text也要单独定义属性。
总之全部封装好后,读写完Excel文件后就能正确释放,不再有多余Excel进程残留。

http://www.yayakq.cn/news/938306/

相关文章:

  • 平邑网站定制燃烧学课程网站建设
  • 网站建设与网页设计开题报告直播视频app
  • 制作团购网站做服务器的网站都有哪些
  • 冷色调网站网站建设 6万贵不贵
  • 为什么小城市做不出来好的网站重庆房产信息网
  • 深圳网站建设怎么网站域名注册步骤
  • 潍坊个人网站制作做网站留后门是怎么回事
  • 张家界建设网站的公司保山网站建设报价
  • 成立一个网站平台要多少钱文化建设的例子
  • 英文网站建设服务合同模板外发加工网有哪些
  • 临夏州住房和城乡建设局网站微信公众号怎么创建要多少钱
  • wordpress 多个边栏息烽县抖音seo推广
  • 做网站安阳oppo软件商店
  • 电子商务网站建设和推广论文网做 网站有哪些功能
  • 网站如何引导页广州市网站网页制作公司
  • 广东建设工程备案网站福州做推广有哪些网站
  • 九曲网站建设苏州房产网
  • 网站设计做多宽个人网站建设案例课堂
  • 淘宝网站怎样建跨境电商erp软件前十名
  • 二手设备回收做哪个网站好wordpress如何设置点击直接下载
  • 青岛网站建设有限公司个人网站做百度云电影链接犯法吗
  • 中国有几大网站重庆专题片制作
  • 大连比较好的网站公司吗石家庄现状
  • 免费源码交易网站源码青岛做外贸网站建设
  • 乔拓云网站注册百度seo提高排名费用
  • 毛站网站源码是什么格式
  • 做美食网站的图片大全为什么网站要改版
  • 唐山滦县网站建设电子政务网站建设出版社
  • 大学做html个人网站素材移动网站构建
  • 鹰潭市城乡建设局老网站济南网站制作建设