Foxtable(狐表)用户栏目专家坐堂 → [求助]工作薄的多个表导入到foxtable的多个表工作薄频繁打开


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

主题:[求助]工作薄的多个表导入到foxtable的多个表工作薄频繁打开

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


加好友 发短信
等级:幼狐 帖子:136 积分:1230 威望:0 精华:0 注册:2019/12/27 20:56:00
[求助]工作薄的多个表导入到foxtable的多个表工作薄频繁打开  发帖心情 Post By:2025/3/30 17:18:00 [只看该作者]

求教老师:我提取一个工作薄中的多个工作表数据到foxtable对应的多个表(可以是EXECL和WPS打开),但在代码执行过程中每提取一个工作的数据工作薄就打开次一次,进程中有多个,如何打开一次就可以了,老师给看看是什么问题
'1.打开要提取数据的工作薄
Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter = "excel文件|*.xlsx; *.xls;*.xlsm" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    Dim dtb As New DataTableBuilder(FileSys.GetName(dlg.FileName))'定义dtb为新的临时表
End If 
'2.设置不需要提取数据的固定工作表
Dim excludeSheets As New List(Of String)'定义一个集合
excludeSheets.Add("产值汇总表")'增加工作表名称
excludeSheets.Add("量价差汇总")'增加工作表名称
excludeSheets.Add("劳务费用分劈表控制")'增加工作表名称
excludeSheets.Add("工程量汇总")'增加工作表名称
excludeSheets.Add("对下计价台账控制")'增加工作表名称
excludeSheets.Add("对下计价台账业务")'增加工作表名称
excludeSheets.Add("工程量汇总旧")'增加工作表名称
'3启动一个隐藏的Excel进程,能够通过代码自动化操作Excel
Dim App As New MSExcel.Application
'App.Visible = True'execl表可见
'4.定义工作薄和工作表
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(dlg.FileName)'定义wb为工作薄
Dim book As New XLS.Book(dlg.FileName) '定义一个Excel工作簿
Dim Sheet As XLS.Sheet '定义工作表
'5.遍历要提取数据的工作表
For Each sheet In book.Sheets'在工作表中遍历
    Dim sheetName As String = sheet.Name.Trim() '取工作表名并前后去空格
    If excludeSheets.Contains(sheetName) = False AndAlso sheetName.Contains("业务") = False Then'固定表名称不包括本表名称和工作表名不包含业务
        ' 创建对应Foxtable结构
        Dim dt As New DataTableBuilder(sheetname)'用工作表名创建临时表
        dt.AddDef("编码", GetType(String), 50)
        dt.AddDef("开累已计价数量", GetType(Double), 50)
        dt.AddDef("开累应计未计数量", GetType(Double), 50)
        dt.AddDef("开累已计价金额", GetType(Double), 50)
        dt.AddDef("序号", GetType(String), 50)
        dt.AddDef("项目内容", GetType(String), 200)
        dt.AddDef("单位", GetType(String), 50)
        dt.Build()
        MainTable = Tables(sheetname)
        
        
        ' 读取Excel数据
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(sheetName)'定义ws为工作表
        '从下向上查找最后一个行并得到其行号.
        Dim FirstRow As Integer = ws.Range("E2000").End(MSExcel.XlDirection.xlup).Row
        '对A列从第1行开始向下查找,直到找到最后一个非空单元格为止,并得到其行号.也就是有内容的开始行
        Dim Rg As MSExcel.Range = ws.UsedRange
        Dim ary = rg.value
        Dim bb2 As Integer = FirstRow 'Sheet2.Rows.Count
        '填充数据
        For n As Integer = 5 To bb2 '5代表从工作表第5行开始逐行遍历’
            Dim ro As Row = Tables(sheetname).AddNew '新增一行’
            For i As Integer = 1 To 7 '1代表从第一个列开始读取’
                ro(i - 1) = ary(n, i) 'i + 2代表数据从第三列后开始填充’
            Next
        Next
    End If
Next


[此贴子已经被作者于2025/3/30 17:48:19编辑过]

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


加好友 发短信
等级:超级版主 帖子:113159 积分:576218 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/3/30 21:00:00 [只看该作者]

试试

'1.打开要提取数据的工作薄
Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter = "excel文件|*.xlsx; *.xls;*.xlsm" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    '2.设置不需要提取数据的固定工作表
    Dim excludeSheets As New List(Of String)'定义一个集合
    excludeSheets.Add("产值汇总表")'增加工作表名称
    excludeSheets.Add("量价差汇总")'增加工作表名称
    excludeSheets.Add("劳务费用分劈表控制")'增加工作表名称
    excludeSheets.Add("工程量汇总")'增加工作表名称
    excludeSheets.Add("对下计价台账控制")'增加工作表名称
    excludeSheets.Add("对下计价台账业务")'增加工作表名称
    excludeSheets.Add("工程量汇总旧")'增加工作表名称
    '3启动一个隐藏的Excel进程,能够通过代码自动化操作Excel
    Dim App As New MSExcel.Application
    'App.Visible = True'execl表可见
    '4.定义工作薄和工作表
    Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(dlg.FileName)'定义wb为工作薄
    '5.遍历要提取数据的工作表
    For Each sheet As MSExcel.WorkSheet In Wb.WorkSheets '在工作表中遍历
        Dim sheetName As String = sheet.Name.Trim() '取工作表名并前后去空格
        If excludeSheets.Contains(sheetName) = False AndAlso sheetName.Contains("业务") = False Then'固定表名称不包括本表名称和工作表名不包含业务
            ' 创建对应Foxtable结构
            Dim dt As New DataTableBuilder(sheetname)'用工作表名创建临时表
            dt.AddDef("编码", GetType(String), 50)
            dt.AddDef("开累已计价数量", GetType(Double), 50)
            dt.AddDef("开累应计未计数量", GetType(Double), 50)
            dt.AddDef("开累已计价金额", GetType(Double), 50)
            dt.AddDef("序号", GetType(String), 50)
            dt.AddDef("项目内容", GetType(String), 200)
            dt.AddDef("单位", GetType(String), 50)
            dt.Build()
            'MainTable = Tables(sheetname)
            
            Tables(sheetname).StopRedraw
            '从下向上查找最后一个行并得到其行号.
            Dim FirstRow As Integer = sheet.Range("E2000").End(MSExcel.XlDirection.xlup).Row
            '对A列从第1行开始向下查找,直到找到最后一个非空单元格为止,并得到其行号.也就是有内容的开始行
            Dim Rg As MSExcel.Range = sheet.UsedRange
            Dim ary = rg.value
            Dim bb2 As Integer = FirstRow 'Sheet2.Rows.Count
            '填充数据
            For n As Integer = 5 To bb2 '5代表从工作表第5行开始逐行遍历’
                Dim ro As Row = Tables(sheetname).AddNew '新增一行’
                For i As Integer = 1 To 7 '1代表从第一个列开始读取’
                    ro(i - 1) = ary(n, i) 'i + 2代表数据从第三列后开始填充’
                Next
            Next
            Tables(sheetname).ResumeRedraw
        End If
    Next
    Wb.Close
    App.quit
End If

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


加好友 发短信
等级:幼狐 帖子:136 积分:1230 威望:0 精华:0 注册:2019/12/27 20:56:00
  发帖心情 Post By:2025/3/30 21:55:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20250330215339.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:136 积分:1230 威望:0 精华:0 注册:2019/12/27 20:56:00
  发帖心情 Post By:2025/3/30 21:56:00 [只看该作者]

弹出这个 


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


加好友 发短信
等级:超级版主 帖子:113159 积分:576218 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/3/30 22:36:00 [只看该作者]

加上

wb.saved = True
App.DisplayAlerts = False

 回到顶部