以文本方式查看主题 - Foxtable(狐表) (http://www.foxtable.com/bbs/index.asp) -- 专家坐堂 (http://www.foxtable.com/bbs/list.asp?boardid=2) ---- [求助]怎样多文件导入 (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=162374) |
||
-- 作者:zto001 -- 发布时间:2021/4/12 23:46:00 -- [求助]怎样多文件导入 如何批量导入Excel表格 Post By:2020/4/8 8:47:00 [只看该作者]
|
||
-- 作者:zto001 -- 发布时间:2021/4/12 23:47:00 -- 顺便问下如何大量数据导入,一次性好几万。我翻遍了没找到那个帖子 [此贴子已经被作者于2021/4/12 23:53:40编辑过]
|
||
-- 作者:有点蓝 -- 发布时间:2021/4/13 8:36:00 -- 是工作表的名称,确保所有execl文件都有订单这个sheet名称 mg.SourceTableName = "订单" \'指定要合并的表
|
||
-- 作者:zto001 -- 发布时间:2021/4/13 17:35:00 -- 我的表格里面的工作表是Sheet1 mg.SourceTableName = "Sheet1" \'指定要合并的表 还是错误
|
||
-- 作者:zto001 -- 发布时间:2021/4/13 18:13:00 -- 有没有比导入速度更快的?跟高速合并一样快,但代码又简单,楼上那种能导十几万,但是太复杂了。(我用的是窗口表) |
||
-- 作者:有点蓝 -- 发布时间:2021/4/13 20:19:00 -- 那就只能是1楼的用法 一些Excel文件,可能需要在表名后加上符号$才能正常导入,例如: Dim mg As New Merger |
||
-- 作者:客人 -- 发布时间: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列要唯一)导入,怎么弄好点? |
||
-- 作者:有点蓝 -- 发布时间:2021/4/15 14:07:00 -- 能不能导到窗口表自己测试一下不就知道了:Dim dt As Table = tables("窗口1_table1") 去重要在导入数据后,再遍历所有列查询判断
|
||
-- 作者:zto001 -- 发布时间: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 我的两个表不一样,要怎么改才能导入? |
||
-- 作者:有点蓝 -- 发布时间: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 Dim mapping1 As new System.Data.SqlClient.SqlBulkCopyColumnMapping(源表列名, 目的表列名) Copy.ColumnMappings.Add(mapping1) |