以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [分享]通用导入Excel表合并Excel导入表自定义函数  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=169948)

--  作者:flashman
--  发布时间:2021/7/7 10:34:00
--  [分享]通用导入Excel表合并Excel导入表自定义函数
Foxtable通用导入Excel表

引出需求:

帮助文件中有关两表合并的代码: http://www.foxtable.com/webhelp/topics/2137.htm
如果两个表的结构不同,可以参考下面的代码:
Dim cmd As New SQLCommand
Dim dt As DataTable
Dim sCols() As String = {"列名1", "列名2", "列名3"}
Dim dCols() As String = {"列名A", "列名B", "列名C"}
cmd.ConnectionName = "数据源名称"
cmd.CommandText = "SELEC T * From {员工}"
dt = cmd.ExecuteReader()
For Each dr As DataRow In dt.DataRows
    Dim nr As DataRow = DataTables("员工").AddNew()
    For i As Integer =0 To sCols.Length -1
        nr(dCols(i)) = dr(sCols(i))
    Next
Next
但是,大多数情况是一个Foxtable表,另外一个是电脑上的Excel表,结构也可能不同;
这种业务场景大多数是企业已有的系统导出Excel表格,需要汇总分析。


下面我做了一个通用的导入自定义函数,函数名和参数如下:
Dim dt As DataTable DataTables("员工" \'需要合并的Foxtable表
Dim dCols() As String {"列名A", "列名B", "列名C"} \'Foxtable表字段
Dim sCols() As String {"列名1", "列名2", "列名3"} \'Excel表字段
Dim k As Integer = 1   \'Excel表头标题是第几行,如果是第一行,即代码里的第0行
\'
Functions.Execute("通用导入Excel表",dt,dCols,sCols,k)
\'保存, 一般有专门的保存按钮
dt.save()

自定义函数主要实现如下功能:
1、一次处理多文件(需Excel表头结构一致);
2、Excel表的列顺序无需与Foxtable表顺序一致,列名也可不同,只需要dCols与sCols想对应;
3、自设Excel文件表头标题所在行,企业导出其他系统的Excel表,很可能表头标题行不在首行。
4、检查预设Excel表字段(sCols)与选择的Excel表头结构,确保每个选中的Excel表结构都是正确的,以防选错文件而导致异常导入。
5、Foxtable表的列数据类型是整型或高精度小数等数值型,但Excel表格里是文本型,则自动转换。

参考下面的代码:

以下内容只有回复后才可以浏览


自定义函数未实现功能:如果Foxtable表中已经存在相同数据的行,通常需要对此行进行跳过或更新数据;
如果订单表中已经存在相同编号的订单,那么就跳过此订单,可以将代码改为:

Dim Book As New XLS.Book("c:\\test\\订单.xls") 
Dim Sheet As XLS.Sheet = Book.Sheets(0)
Tables("订单").StopRedraw()
\'注意以下数组中列名称的顺序,必须和Excel表中的列顺序一致
Dim nms() As String = {"编号","产品","客户","雇员","单价","折扣","数量","日期"} 
\'注意下面的循环变量从1开始,而不是从0开始,因为Excel表的第一行是标题 
For n As Integer = 1 To Sheet.Rows.Count -1 
    Dim bh As String = sheet(n,0).Text 
    If DataTables("订单").Find("编号 = \'" & bh & "\'") Is Nothing Then \'如果不存在同编号的订单
        Dim r As Row = Tables("订单").AddNew()
        For m As Integer = 0 To nms.Length - 1
            r(nms(m)) = Sheet(n,m).Value
        Next
    End If
Next
Tables("订单").ResumeRedraw()
如果想导入图形化(窗体),Foxtable表列字段和Excel表头列字段点选,已经存在相同数据行,自己觉得是无条件导入还是跳过或覆盖,甚至对Excel表的数据行内容进行按自己的数据原则进行先检查,如果货号是否在Foxtable系统里存在,若不存在则需要先维护Foxtable中的货号等,无误后导入。
下图是一个雏形,希望多提建设性意见。

图片点击可在新窗口打开查看此主题相关图片如下:通用导入excel表.png
图片点击可在新窗口打开查看


--  作者:cd_tdh
--  发布时间:2021/7/7 10:39:00
--  

学习,直接来个商业版示例文件呢?

[此贴子已经被作者于2021/7/7 10:41:13编辑过]

--  作者:有点蓝
--  发布时间:2021/7/7 10:40:00
--  
多谢分享
--  作者:vbmic
--  发布时间:2021/7/7 10:44:00
--  
图片点击可在新窗口打开查看学习
--  作者:z769036165
--  发布时间:2021/7/7 10:50:00
--  
支持!!
--  作者:冷泉
--  发布时间:2021/7/7 11:14:00
--  
看看
--  作者:cnsjroom
--  发布时间:2021/7/7 11:17:00
--  回复:(flashman)[分享]通用导入Excel表合并Excel导...
学习一下
--  作者:witkeylaw
--  发布时间:2021/7/7 11:47:00
--  
点赞。。。。
--  作者:青丘狐
--  发布时间:2021/7/7 12:20:00
--  
谢谢分享
--  作者:方丈
--  发布时间:2021/7/7 12:58:00
--  
多谢分享