Foxtable(狐表)用户栏目专家坐堂 → [求助]怎样多文件导入


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

主题:[求助]怎样多文件导入

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


加好友 发短信
等级:六尾狐 帖子:1465 积分:10397 威望:0 精华:0 注册:2018/10/16 11:42:00
[求助]怎样多文件导入  发帖心情 Post By:2021/4/12 23:46:00 [只看该作者]

如何批量导入Excel表格  发帖心情 Post By:2020/4/8 8:47:00 [只看该作者]

工作中需要批量导入Excel表格,如何才能实现呢?谢谢


 发帖心情 Post By:2020/4/8 9:04:00 [只看该作者]

比如

Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter= "Excel文件|*.xls" '设置筛选器
dlg.MultiSelect=true
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    For each file as string in dlg.FileNames
Dim mg As New Merger
mg
.SourcePath = file
mg
.Format = "excel" '指定格式
mg
.SourceTableName = "订单" '指定要合并的表
mg
.DataTableName = "订单" '指定接收数据的表
mg
.Merge() '开始合并
    Next
End If


我这里提示错误:
.错误所在事件:
详细错误信息:
Microsoft Jet 数据库引擎找不到对象'订单'。请确定对象是否存在,并正确地写出它的名称和路径。
mg.SourceTableName = "订单" '指定要合并的表
这个是工作表的名称吗?


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


加好友 发短信
等级:六尾狐 帖子:1465 积分:10397 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2021/4/12 23:47:00 [只看该作者]

顺便问下如何大量数据导入,一次性好几万。我翻遍了没找到那个帖子

[原创]使用OpenXml导入导出Excel2007格式的文件,支持100W行上百M的大文件  图片点击可在新窗口打开查看 Post By:2017/5/9 15:11:00 [只看该作者]

[总结分享]sqlBulkCopy批量插入大量数据 (批量导入、快速导入、1秒1w行)  图片点击可在新窗口打开查看 Post By:2020/3/13 11:56:00 [只看该作者]
[此贴子已经被作者于2021/4/12 23:53:40编辑过]

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


加好友 发短信
等级:超级版主 帖子:106036 积分:539273 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/4/13 8:36:00 [只看该作者]

是工作表的名称,确保所有execl文件都有订单这个sheet名称

mg.SourceTableName = "订单" '指定要合并的表

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


加好友 发短信
等级:六尾狐 帖子:1465 积分:10397 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2021/4/13 17:35:00 [只看该作者]

我的表格里面的工作表是Sheet1
mg.SourceTableName = "Sheet1" '指定要合并的表
还是错误

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


加好友 发短信
等级:六尾狐 帖子:1465 积分:10397 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2021/4/13 18:13:00 [只看该作者]

有没有比导入速度更快的?跟高速合并一样快,但代码又简单,楼上那种能导十几万,但是太复杂了。(我用的是窗口表)

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


加好友 发短信
等级:超级版主 帖子:106036 积分:539273 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/4/13 20:19:00 [只看该作者]

那就只能是1楼的用法

一些Excel文件,可能需要在表名后加上符号$才能正常导入,例如:

Dim mg As New Merger
mg
.SourcePath = "c:\data\销售管理.xls"
mg
.Format = "excel" '指定格式
mg
.SourceTableName = "订单$" '指定要合并的表
mg
.DataTableName = "订单" '指定接收数据的表
mg
.Merge() '开始合并


 回到顶部
客人(222.247.*.*)
  7楼


  发帖心情 Post By:2021/4/15 14:01:00 [只看该作者]

【二楼第一个链接】
自定义函数
Dim state As Integer = Args(0)
Dim Index As Integer = Args(1)
Dim length As Integer = Args(2)
Dim cols() As String = Args(3)


Dim dt As Table = CurrentTable
Dim dlg As New OpenFileDialog '定义一个新的OpenFileDialog
dlg.Filter= "Excel2007文件|*.xlsx" '设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then '如果用户单击了确定按钮
    dt.StopRedraw
    Dim d1 As Date = Date.Now
    Dim _execl As New ExOpenXml.ExOXExecl()
    _execl.Open(dlg.FileName,True) '不需要保存文档,第二个参数设置为True
    If state = 0 Then
        _execl.AppendToDataTable(dt.DataTable.Basetable, , cols, Index , length )
    Else
        _execl.ReadToDataTable(dt.DataTable.Basetable, , cols, Index , length)
    End If
    _execl.dispose
    dt.ResumeRedraw
    If dt Is Nothing Then
        msgbox("没有数据可以导入!")
        Return ""
    End If
    Dim tp As TimeSpan = now() - d1
    msgbox("合并导入成功,用时: " & tp.TotalSeconds & "秒.")
End If

导入代码:
Dim ccbCols As WinForm.CheckedComboBox = e.Form.Controls("ccbCols")
If ccbCols.Text > "" Then
    Functions.Execute("AppendFromExecl",0,0,10000000,ccbCols.Text.Split(","),False)
Else
    Functions.Execute("AppendFromExecl",0,0,10000000,Nothing)
End If

想问下这个能不能导到窗口表?还有如果我想去重(比如ID列要唯一)导入,怎么弄好点? 

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


加好友 发短信
等级:超级版主 帖子:106036 积分:539273 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/4/15 14:07:00 [只看该作者]

能不能导到窗口表自己测试一下不就知道了:Dim dt As Table = tables("窗口1_table1")

去重要在导入数据后,再遍历所有列查询判断

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


加好友 发短信
等级:六尾狐 帖子:1465 积分:10397 威望:0 精华:0 注册:2018/10/16 11:42:00
  发帖心情 Post By:2021/4/15 15:43:00 [只看该作者]

Dim dt As DataTable = DataTables("Sheet1") '修改为你的表
Dim conStr As String = "server=s***p,16131;uid=**;pwd=z***6;database=A***透" '改为自己数据库的连接字符串,注意跟狐表的数据库字符串不同,不能拿来用
Dim tran As System.Data.SqlClient.SqlTransaction
Dim conn As new System.Data.SqlClient.SqlConnection(conStr)

Try
    Dim st As Date = Date.Now '计算耗时
    conn.Open() '打开链接
    tran = conn.BeginTransaction()'开始事务
    Dim mpList As new List(of System.Data.SqlClient.SqlBulkCopyColumnMapping)
    '配置本地来源列与服务器目标列的配对关系,第一个参数是"来源列",第二个是"目标列"
    For Each dc As DataCol In dt.DataCols
        mpList.Add( new System.Data.SqlClient.SqlBulkCopyColumnMapping(dc.Name, dc.Name))
    Next
    Dim copy As new System.Data.SqlClient.SqlBulkCopy(conn, System.Data.SqlClient.SqlBulkCopyOptions.Default, tran)
    '把刚才的匹配关系,导进去SqlBulkCopy的参数里
    For Each mp As System.Data.SqlClient.SqlBulkCopyColumnMapping In mpList
        Copy.ColumnMappings.Add(mp)
    Next
    copy.Destinati '指定服务器上目标表的名称
    copy.BulkCopyTimeout=30 '默认30秒超时
    copy.BatchSize = CInt(dt.DataRows.Count/10) '每批事务插入的数据量,推荐插入的总行数/10,性能最佳
    copy.WriteToServer(dt.basetable)  '你的本地DataTable,要转成.net官方的基表类型
    tran.Commit()
    
    Dim res As Double = Format(dt.DataRows.Count /10000,"0.00")
    MessageBox.Show("批量插入成功, " & res & "W行 耗时: " & (Date.Now - st).TotalSeconds & "秒")
Catch ex As exception
    tran.Rollback()    '返回False 执行失败!
    MessageBox.Show("批量插入失败,原因:" & ex.message)
Finally
    conn.Close() '必须关闭,否则内存会一直泄露
End Try


我的两个表不一样,要怎么改才能导入?


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


加好友 发短信
等级:超级版主 帖子:106036 积分:539273 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/4/15 15:50:00 [只看该作者]

Dim Cols1() As String = {"来源列一","来源列二","来源列三"}
Dim 
Cols2() As String = {"接收列一","接收列二","接收列三"}
    For i As Integer = 0 To Cols1.Length -1
mpList.Add( new System.Data.SqlClient.SqlBulkCopyColumnMapping(Cols1(i)Cols2(i)))
    Next


 回到顶部
总数 17 1 2 下一页