Foxtable通用导入Excel表
引出需求:
如果两个表的结构不同,可以参考下面的代码:
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