Rss & SiteMap

Foxtable(狐表) http://www.foxtable.com

新一代数据库软件,完美融合Access、Foxpro、Excel、vb.net之优势,人人都能掌握的快速软件开发工具!
共94 条记录, 每页显示 10 条, 页签: [1] [2][3][4][5][6][7][8] ...[10]
[浏览完整版]

标题:[分享]通用导入Excel表合并Excel导入表自定义函数

1楼
flashman 发表于:2021/7/7 10:34:00
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
图片点击可在新窗口打开查看

2楼
cd_tdh 发表于:2021/7/7 10:39:00

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

[此贴子已经被作者于2021/7/7 10:41:13编辑过]
3楼
有点蓝 发表于:2021/7/7 10:40:00
多谢分享
4楼
vbmic 发表于:2021/7/7 10:44:00
图片点击可在新窗口打开查看学习
5楼
z769036165 发表于:2021/7/7 10:50:00
支持!!
6楼
冷泉 发表于:2021/7/7 11:14:00
看看
7楼
cnsjroom 发表于:2021/7/7 11:17:00
学习一下
8楼
witkeylaw 发表于:2021/7/7 11:47:00
点赞。。。。
9楼
青丘狐 发表于:2021/7/7 12:20:00
谢谢分享
10楼
方丈 发表于:2021/7/7 12:58:00
多谢分享
共94 条记录, 每页显示 10 条, 页签: [1] [2][3][4][5][6][7][8] ...[10]

Copyright © 2000 - 2018 foxtable.com Tel: 4000-810-820 粤ICP备11091905号

Powered By Dvbbs Version 8.3.0
Processed in .06641 s, 3 queries.