从Excel中的活动工作表导入SQL Server最快的方法是什么?

什么是直接从Excel中的活动工作表导入数据到SQL Server数据库的最快方法?

我只是循环遍历行和列,生成一个SQLstring,打开一个ADODB.Connection并执行SQL。 然而,这个解决scheme对于大型数据集来说太慢了。

所以我正在用ADOtestingJet Provider。 这绝对是更快,但它需要保存工作簿,并且我不能要求用户在从上传工作簿之前保存工作簿。

如果工作簿已保存,但以下代码可用,但是如果ActiveWorkbook从未保存过,则ActiveWorkbook.Path返回空string,代码将失败。

Sub UploadViaJet() Dim objADO As New ADODB.Connection Dim strSQL As String Dim lngRecsAff As Long Set objADO = New ADODB.Connection objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ActiveWorkbook.Path & _ "\" & ActiveWorkbook.Name & ";" & _ "Extended Properties=Excel 8.0" strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _ "Server=<server>;Database=<database>;" & _ "UID=<UID>;PWD=<PWD>].test_table " & _ "FROM [" & ActiveSheet.Name & "$]" objADO.Execute strSQL, lngRecsAff, adExecuteNoRecords End Sub 

有没有更简单快捷的方法来做到这一点?

解决scheme使用导入Excel文件

既然你有没有强制用户保存文件的限制,并且大多数build议的解决scheme要求保存文件,我会使用VBA

  • 在内存中创build一个工作簿对象
  • 从活动工作表复制粘贴到工作簿
  • SAVEAS工作簿以临时文件名(TempExcelFile.xls)和path
  • 使用上面的Quassnoi的方法导入到SQL Server中
  • 用零覆盖TempExcelFile.xls
  • 删除TempExcelFile.xls

这样用户不会被迫保存工作表,并且会提示他们保存工作表,就像他们在工作过程中那样。

为了便于同时导入多个活动工作表,我将使用时间戳或GUID来创build文件名。


使用ADO查询的解决scheme

让用户从内置VBAmacros的模板中创build工作簿。确保您保护工作簿以防止未经授权访问后面的macros/代码。

执行一个将循环遍历行和列的macros,读取单元格值,构build一个SQL查询并执行它 – 使用带有参数的存储过程来防止注入攻击。

您可以创build一个数据源(使用链接服务器或OPENROWSET ),只需在SQL Server端执行SELECT操作即可:

 SELECT * INTO mytable FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]') 

SQL Server可以访问Excel工作簿的path。

这是关于如何做到这一点的KB文章

通常我使用SSIS导入大型Excel文件。

你有没有尝试只是把一个ActiveWorkBook.SaveAs(“一些临时文件名”)在顶部,并从中导入? 我做了一些类似于macros的工作,将ActiveSheet的内容FTP到远程服务器,并且工作。