以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [分享]通用导入Excel表合并Excel导入表自定义函数 (http://foxtable.net/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中的货号等,无误后导入。 下图是一个雏形,希望多提建设性意见。 |
-- 作者: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 -- 多谢分享 |