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


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

主题:处理EXCEL

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


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

把100个sheet拆分为100个execl文件,再处理

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


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

拆分成100个EXCEL文件,处理完后还得把弄完的100个文件再恢复(业务需要),这一流程下来效率也不高啊,跟单线程处理没有区别了。
但我感觉异步函数那似乎可以实现这个功能呢,只是我技艺不精,麻烦老师费心给看看呗,谢谢谢谢啦。图片点击可在新窗口打开查看

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


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

老师能帮帮忙吗?

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


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

我也没有办法。网上搜了一下,这样说的

Excel本质上是一个单线程应用程序(从技术上讲,COM对象位于单线程单元中)。 这意味着任何COM访问都会自动编组到主线程,因此使用额外的线程进行COM调用没有任何好处。

对于您的用例,在一次对Range.Value的调用中获得整个数据数组,然后在不使用额外的COM调用的情况下进一步处理该数组将是有意义的。

另一种方法是直接读取Excel数据文件,而不与Excel应用程序进行交互。 为此,您可以对基于XML的文件格式(如ClosedXML)使用高级包装。


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


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

好的,谢谢老师指导。另外一种方法是直接读取excel数据文件?意思是把excel转成xml再处理是吗?可有相关案例?

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


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

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

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


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

我之所以没用那些方法是考虑到往回写数据的时候会改变原有excel的样式,不想破坏excel样式的前提下操作excel文件。

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


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

我妥协了,只能把单个文件的处理放到异步里了,调试了一下报了调用的目标发生了异常。索引超出了数组界限。请老师帮忙再给看看
BUTTON按钮代码:

Dim FilePath As String =  e.Form.Controls("TextBox1").value
Functions.Execute("处理SHEET",FilePath)
______________

“处理SHEET"函数代码:

Dim st As Date = Date.Now
Dim lbl9 As WinForm.Label = Forms("窗口1").Controls("Label9")
Dim path As String = args(0)
Dim file As Object
Dim dic As new Dictionary(of String,String)
Dim dicfile As String =  Forms("窗口1").Controls("TextBox2").value

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(path)
    Functions.AsyncExecute("异步函数",file,dic)
Next
————————————————————————————
”异步函数“代码:

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
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
output.show(1)
        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 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
End If

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


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

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

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

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

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


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

改为同步程序正常执行。
For Each file In FileSys.GetFiles(path)
    Functions.AsyncExecute("异步函数",file,dic) 改为 Functions.Execute("异步函数",file,dic)
Next

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