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


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

主题:处理EXCEL

帅哥,在线噢!
有点蓝
  21楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/15 10:01:00 [显示全部帖子]

这个要xlsx文件才支持。网上搜索openxml看看,转成xml再处理这个工作量不少

 回到顶部
帅哥,在线噢!
有点蓝
  22楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/18 15:13:00 [显示全部帖子]

先改为同步调用,调试一下看是哪一句出错,测试没有问题再改为异步。

另外要注意异步:http://www.foxtable.com/mobilehelp/topics/277.htm

不能在异步函数里使用窗口控件。如果需要控件的值,从外部传入函数。如果要给控件赋值,需要调用同步函数处理

 回到顶部
帅哥,在线噢!
有点蓝
  23楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望: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

 回到顶部
帅哥,在线噢!
有点蓝
  24楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望: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

 回到顶部
帅哥,在线噢!
有点蓝
  25楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望: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)

 回到顶部
帅哥,在线噢!
有点蓝
  26楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望: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

 回到顶部
帅哥,在线噢!
有点蓝
  27楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/20 14:26:00 [显示全部帖子]

是的

 回到顶部
帅哥,在线噢!
有点蓝
  28楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/20 15:11:00 [显示全部帖子]

Dim rt As WinForm.TextBox = e.Form.Controls("TextBox1")
rt.Select
rt.SelectionStart = rt.text.length
Dim b = rt.basecontrol
b.ScrollToCaret

 回到顶部
帅哥,在线噢!
有点蓝
  29楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/24 15:49:00 [显示全部帖子]


[此贴子已经被作者于2021/5/24 15:49:22编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  30楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107740 积分:548039 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/5/24 15:50:00 [显示全部帖子]

函数代码发上来看看

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