Foxtable(狐表)用户栏目专家坐堂 → 处理EXCEL


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

主题:处理EXCEL

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/18 15:21:00 [只看该作者]

以下代码删除了也不管用:

 Dim txt1 As WinForm.TextBox = Forms("窗口1").Controls("TextBox3")
    txt1.text = file & vbcrlf & txt1.text & vbcrlf
    Application.DoEvents()
    FileCount=FileCount+1
    lbl.Text="共处理" & FileCount & "个文件"

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/18 15:56:00 [只看该作者]

还有哪可能有错呢?老师帮忙看看

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


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/18 16:27:00 [只看该作者]

使用Output.Logs日志功能调试一下看那一句出错

我这样测试没有问题

异步函数
Dim app As new MSExcel.Application
App.Visible = False
App.DisplayAlerts = False
Dim Numcb1 As Integer = args(2)
Dim Numcb2 As Integer = args(3)
Dim file = args(0)
Dim dic  = args(1)
Dim excelcol,RowsMax,ColsMax  As Integer
Dim excelrows As Integer

If file.EndsWith(".xls") OrElse file.EndsWith(".XLS") OrElse file.EndsWith(".xlsx") OrElse file.EndsWith(".XLSX")   Then
    If file.EndsWith(".xls") OrElse file.EndsWith(".XLS")  Then
        excelcol = 256
        excelrows  =65536
    Else
        excelcol = 16384
        excelrows  =1048576
    End If
    
    Dim wb=app.WorkBooks.open(file)
    For k As Integer=1 To wb.worksheets.Count
        'Output.Logs("登录日志").Add("k=" & k & ",Wb.WorkSheets(k).Visible=" & Wb.WorkSheets(k).Visible)
        'Output.Logs("登录日志").Save(ProjectPath & "log.txt",True)
        'Output.Logs("登录日志").Clear
        If Wb.WorkSheets(k).Visible <> 0 Then        '如果sheet表为不隐藏时处理(0隐藏,-1为不隐藏
            Dim Ws As MSExcel.WorkSheet=Wb.WorkSheets(k)
            If Numcb1 = 0 And Numcb2 = 0 Then
                RowsMax = 0
                ColsMax = ws.UsedRange.columns.count
                '获取最大行
                For i As Integer = 1 To ColsMax
                    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
                
            Else
                RowsMax = Numcb1
                ColsMax = Numcb2
            End If
            
            Dim  rg As MSExcel.Range =  Ws.Range(Ws.Cells(1,1), Ws.Cells(200,200)) 'RowsMax,ColsMax
            
            If rg.Count = 1 And rg(1).Value Is Nothing Then
                Continue For
            End If
            
            Dim ary = rg.value
            For i As Integer=1 To RowsMax
                For j As Integer = 1 To ColsMax
                    If ary(i, j) <> Nothing  AndAlso Typeof ary(i,j) Is String AndAlso dic.ContainsKey(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), "")) Then
                        rg(i, j).Value= dic(ary(i,j).ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), ""))
                    End If
                Next
                
            Next
            
        End If '不处理隐藏sheet
    Next
    
    'Dim txt1 As WinForm.TextBox = Forms("窗口1").Controls("TextBox3")
    'txt1.text = file & vbcrlf & txt1.text & vbcrlf
    'Application.DoEvents()
    'FileCount=FileCount+1
    'lbl.Text="共处理" & FileCount & "个文件"
    wb.Save
    app.quit
    Output.Logs("登录日志").Add("app.quit=true")
    Output.Logs("登录日志").Save(ProjectPath & "log.txt",True)
    Output.Logs("登录日志").Clear
End If

命令窗口测试
Dim file As String
Dim dic As new Dictionary(of String,String)
Dim dicfile As String =  "D:\问题\test\dict.xls"

Dim Book As New XLS.Book(dicfile) '定义一个Excel工作簿
Dim Sheet As XLS.Sheet = Book.Sheets(0) '引用工作簿的第一个工作表

For i As Integer = 0 To Sheet.Rows.Count-1
    If dic.ContainsKey(Sheet(i, 0).Text.ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), "")) = False Then
        dic.add(Sheet(i, 0).Text.ToLower.Replace(" ","").Replace(chr(10), "").Replace(chr(13), ""),Sheet(i, 1).Text)
    End If
Next

For Each file In FileSys.GetFiles("D:\问题\test\1")
    Functions.AsyncExecute("异步函数",file, dic, 0,0)
Next

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/18 17:06:00 [只看该作者]

1、找到原因了,是因为ColsMax 和 rowsMax两个变量我在“全局代码”中使用PUBLIC定义的,只要在全局代码中定义就报错,在函数内部用DIM定义就没问题。帮助文件说是可以用PUBLIC的啊?
2、程序在执行时观察两个文件的保存时间。(两个EXCEL文件一模一样,但还能看出两个文件保存的时间差,10多秒左右)如果是异步不应该是同时处理两个文件同时保存吗?为什么感觉程序还是先处理了A文件然后再处理了B文件这个顺序呢?
2、我想在异数函数中统计处理了几个文件如何写?

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


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/18 17:18:00 [只看该作者]

1、PUBLIC肯定是可以的,问题是如果有多个函数都用到,A函数赋值10,B函数赋值20,A函数使用的时候值是20肯定就错了
2、不同的文件处理时间肯定不一样,就算是同时也有差距的。这个和赛跑的道理一样,同时出发未必同时到达。
3、异步里使用同步函数更新一个PUBLIC变量:http://www.foxtable.com/mobilehelp/topics/3270.htm

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/19 16:30:00 [只看该作者]

DEF函数代码为:
Forms("窗口1").Controls("Label11").text = args(0)
————————
异步函数中调用同步函数
Functions.BeginSyncExecute("def","[文件名:" & file & "]" & "," & "[Sheet名称:" & ws.name & "]" & vbcrlf )

想实现在LABEL的文本属性中多行动态显示异步处理的多个文件信息,上面的代码只能看到一行信息不断的变化,所有信息都混在一行。我要同步多行显示如何实现?达到的显示效果如下:

[文件名:1.xls],[sheet名称:sheet1]
[文件名:2.xls],[sheet名称:sheet2]
[文件名:3.xls],[sheet名称:sheet3]
[文件名:4.xls],[sheet名称:sheet4]
........
[文件名:N.XLS],[SHEET名称:sheetN]


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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/19 17:00:00 [只看该作者]

目的是为动态显示异步正在处理的文件信息

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


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/20 8:59:00 [只看该作者]

建议使用多行文本框

DEF函数代码为:
Forms("窗口1").Controls("Label11").text &= vbcrlf &  args(0)

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10574 威望:0 精华:0 注册:2014/2/19 16:32:00
  发帖心情 Post By:2021/5/20 14:01:00 [只看该作者]

把LABEL换成了TEXTBOX,按您的方法改了CPU占用特别高,程序处理假死状态什么原因?

这句用改吗?
异步函数中调用同步函数
Functions.BeginSyncExecute("def","[文件名:" & file & "]" & "," & "[Sheet名称:" & ws.name & "]" & vbcrlf )
[此贴子已经被作者于2021/5/20 14:00:51编辑过]

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


加好友 发短信
等级:超级版主 帖子:107304 积分:545781 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/20 14:07:00 [只看该作者]

不要在异步里频繁更新界面,这样做其实和同步差不多了。

加一句试试
Forms("窗口1").Controls("Label11").text &= vbcrlf &  args(0)
Application.DoEvents

 回到顶部
总数 108 上一页 1 2 3 4 5 6 7 8 9 10 下一页 ..11