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


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

主题:处理EXCEL

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望: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、我想在异数函数中统计处理了几个文件如何写?

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望: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
  33楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


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

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

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


加好友 发短信
等级:五尾狐 帖子:1107 积分:10586 威望: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编辑过]

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


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

您的意思是异数函数里频繁调用同步函数会影响效率是吗?

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


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

好的,明白了。那我还是少频繁更新吧。

追问一个:往TEXTBOX追加多行的内容的时候,如何让每次追加都滚动到最后一行?而不是手动拖滚动条?

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


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

请教老师在异步处理多个EXCEL文件时,处理完想要保存并退出APP.QUIT,那么保存和退出代码是在异步函数里直接写还是在程序的最后统一保存再退出?因为现在处理多个EXCEL文件时会出现如下错误(执行前已经确认进程中不含有EXCEL文件)

.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.5.29.8
错误所在事件:自定义函数,异步函数
详细错误信息:
调用的目标发生了异常。
Microsoft Excel 不能访问文件“D:\test\1\66C1BA10”。 可能的原因有以下几个:

? 文件名称或路径不存在。
? 文件正被其他程序使用。
? 您正要保存的工作簿与当前打开的工作簿同名。

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


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

1、下面是异步函数代码,调用是:Functions.AsyncExecute("异步函数",file,dic)程序执行偶尔会报65楼的错误
2、代码最后一行显示处理文件所用时间时他是实时显示的,我想要处理完所有文件后显示,如何修改?
Dim st As Date = Date.Now
Dim app As new MSExcel.Application
Dim Numcb1 As WinForm.NumericComboBox = Forms("窗口1").Controls("NumComBox1")
Dim Numcb2 As WinForm.NumericComboBox = Forms("窗口1").Controls("NumComBox2")
Dim lbl As WinForm.Label = Forms("窗口1").Controls("Label6")

Dim file = args(0)
Dim dic  = args(1)
Dim excelcol As Integer
Dim excelrows As Integer
Dim RowsMax As Integer
Dim ColsMax 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
    'output.show(file & excelcol & "," & excelrows)
    
    Dim wb=app.WorkBooks.open(file)
    
    For k As Integer=1 To wb.worksheets.Count
        'If Wb.WorkSheets(k).Visible <> 0 Then        '如果sheet表为不隐藏时处理(0隐藏,-1为不隐藏
            Dim Ws As MSExcel.WorkSheet=Wb.WorkSheets(k)
            If Numcb1.Text = Nothing And Numcb2.Text = Nothing 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
                'Output.Show("rowsmax =" & rowsmax )
                '获取最大列
                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
                'Output.Show("ColsMax =" & ColsMax )
            Else
                RowsMax = Numcb1.Value
                ColsMax = Numcb2.Value
            End If
            
            Dim  rg As MSExcel.Range =  Ws.Range(Ws.Cells(1,1), Ws.Cells(RowsMax,ColsMax))
            'If rg.Count = 1 And rg(1).Value = "" Then 'If rg.Count = 1 And rg(1).Value Is Nothing Then
            '下面代码解决doubleTO string转换报错问题.2021-05-07修改
            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
                'If rg.Rows(i).height <> 0 Then
                For j As Integer = 1 To ColsMax
                    'If rg.Columns(j).width <> 0 Then
                    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
                    'End If
                Next
                'End If
            Next
            Functions.BeginSyncExecute("def","[文件名:" & file & "]" & "," & "[Sheet名称:" & ws.name & "]")

        'End If '不处理隐藏sheet
        
    Next


    wb.Save
    app.quit
End If
FileCount=FileCount+1
Functions.BeginSyncExecute("同步函数","已处理" & FileCount & "个文件","耗时: " & (Date.Now - st).TotalSeconds & "秒")

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


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

def函数代码:

Forms("窗口1").Controls("TextBox5").text & = vbcrlf & args(0)
'下面代码可实现TEXTBOX的光标始终在最下面
Dim rt As WinForm.TextBox = Forms("窗口1").Controls("TextBox5")
rt.Select
rt.SelectionStart = rt.text.length
Dim b = rt.basecontrol
b.ScrollToCaret


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


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


1、那如何判断所有异步都执行完了呢,我好给程序一个提示?
2、有必要在异步执行完用e.Handled =true 的方式关闭信道吗?

 回到顶部
总数 59 上一页 1 2 3 4 5 6 下一页