Foxtable(狐表)用户栏目专家坐堂 → 如何在不关闭程序的情况下释放EXCEL


  共有1951人关注过本帖树形打印复制链接

主题:如何在不关闭程序的情况下释放EXCEL

帅哥哟,离线,有人找我吗?
wh420
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
如何在不关闭程序的情况下释放EXCEL  发帖心情 Post By:2017/2/6 17:54:00 [显示全部帖子]

  1. 下列代码第3行-第7行代码在狐表中好像不支持,转换成狐表的代码应该如何写?

  2.  // 9.释放资源  
  3.     System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);  
  4.     System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);  
  5.     System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);  
  6.     System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);  
  7.     System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);  
  8.   
  9.     // 10.调用GC的垃圾收集方法  
  10.     GC.Collect();  
  11.     GC.WaitForPendingFinalizers(); 

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/6 18:56:00 [显示全部帖子]

程序执行app.quit()后仍然有进程在系统里

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/6 19:01:00 [显示全部帖子]

而且设置了app.DisplayAlerts=False,但似乎总是有一个EXCEL关不掉

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/6 23:51:00 [显示全部帖子]

app.quit()的确把EXCEL进程关掉了,只是比较慢。但我的程序反复执行的时候,程序本身占用的内存越来越大导致最后内存不够,得重新关闭程序后才能释放内存,请问如何在程序每执行完一个EXCEL就释放一次内存?
程序代码如下:

For Each file In FileSys.GetFiles(path)
    Dim excelcol As Integer
    Dim excelrows As Integer
    If file.EndsWith(".xls") OrElse file.EndsWith(".xlsx") Then
        DataTables("表A").StopRedraw
        Dim App As New MSExcel.Application
        app.DisplayAlerts=False '是否显示EXCEL警示
        try
            Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(file)
            For k As Integer = 1 To wb.workSheets.Count '//多个sheet的处理
                Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(k)
                Dim Rg As MSExcel.Range = Ws.UsedRange
                
                Dim RowsMax As Integer =0
                Dim ColsMax As Integer = 0
                '获取有效行
                For i As Integer =1 To rg.Columns.count
                    Dim r = ws.cells(excelrows,i).End(MsExcel.XlDirection.xlUp).Row
                    If r > RowsMax Then
                        RowsMax = r
                    End If
                Next
                '获取有效列
                For i As Integer = 1 To rowsMax
                    Dim r = ws.cells(i,excelcol).End(MsExcel.XLDirection.xlToLeft).Column
                    If r > ColsMax  Then
                        ColsMax = r
                    End If
                Next
                rg =  Ws.Range(Ws.Cells(1,1), Ws.Cells(RowsMax,ColsMax))
                Dim ary = rg.value
                
                For i As Integer = 1 To RowsMax
                    If CBox2.Checked OrElse rg.Rows(i).height <> 0 Then
                        For j As Integer = 1 To Colsmax
                            If CBox2.Checked OrElse rg.Columns(j).width <> 0 Then
                                
                                If ary(i,j) <> Nothing Then
                                    If CBox1.Checked = False OrElse CBox1.Checked = True AndAlso System.Text.RegularExpressions.Regex.Match(ary(i,j),"[\u4e00-\u9fa5]+").Tostring()>""
                                        Dim dr As DataRow = DataTables("表A").AddNew
                                        dr("原文") = ary(i, j)
                                        lbl5.text ="提取内容:" & ary(i,j)
                                        Application.DoEvents
                                    End If
                                End If
                            End If
                        Next
                    End If
                Next
            Next
            
            Wb.Close()
            
            Dim txt1 As WinForm.TextBox = Forms("提取工具").Controls("TextBox3")
            txt1.text = file & vbcrlf & txt1.text & vbcrlf
            Application.DoEvents()
            FileCount=FileCount+1
            lbl.Text="已提取" & FileCount & "个文件,未提取 " & BadFileCount & "个文件"
            
        Catch ex As Exception
            Dim txt2 As WinForm.TextBox = Forms("提取工具").Controls("TextBox4")
            txt2.text = file & vbcrlf & txt2.text & vbcrlf
            BadFileCount =BadFileCount +1
            msgbox(ex.message)
        End try
        DataTables("表A").ResumeRedraw
        app.quit()
        GC.ColLECT
    End If
Next
For Each p As String In FileSys.GetDirectories(path)
    Functions.Execute("MSEXCEL提取", p)
Next


 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/6 23:52:00 [显示全部帖子]

用GC.Collect()好像没什么效果

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/7 16:31:00 [显示全部帖子]

老师我按您写的代码做了一个例子,例子报错(异常来自HRESULT),您给看一下。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目5.rar




 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/7 16:44:00 [显示全部帖子]

老师帮忙看看

 回到顶部
帅哥哟,离线,有人找我吗?
wh420
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1107 积分:10562 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2017/2/7 17:42:00 [显示全部帖子]

问题解决,感谢老师

 回到顶部