如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?

Posted

技术标签:

【中文标题】如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?【英文标题】:How to export Excel data from different sheets to SQL-SERVER Database? 【发布时间】:2018-09-05 09:48:29 【问题描述】:

我是 Excel VBA 和 SQL 的新手。我设法创建了一个宏按钮并将 Excel 单元格数据推送到 SQL 服务器表。不过,我有点疑惑:

如何从不同的工作表中获取 Excel 单元格数据,然后将它们推送到 SQL Server 数据库中的不同表中? (目前,我在一个 Excel 文件中有 3 张工作表 - 客户、测试、信息。)

当前工作代码:

Sub Button1_Click()
 
Dim conn As New ADODB.Connection
Dim iRowNo As Integer
Dim sCustomerId, sFirstName, sLastName As String

With Sheets("Customers")
        
    'Open a connection to SQL Server
    conn.Open "Provider=SQLOLEDB;Data Source=TESTpc\SQLEXPRESS;Initial Catalog=ExcelSQLServerDemo;Trusted_connection=yes"
        
   'Skip the header row
    iRowNo = 2
        
    'Loop until empty cell in CustomerId
    Do Until .Cells(iRowNo, 1) = ""
        sCustomerId = .Cells(iRowNo, 1)
        sFirstName = .Cells(iRowNo, 2)
        sLastName = .Cells(iRowNo, 3)
            
        'Generate and execute sql statement to import the excel rows to SQL Server table
        conn.Execute "INSERT into dbo.Customers (CustomerId, FirstName, LastName) values ('" & sCustomerId & "', '" & sFirstName & "', '" & sLastName & "')"

        iRowNo = iRowNo + 1
    Loop
    
    MsgBox "Customers Exported To Database"
        
    conn.Close
    Set conn = Nothing
    
    End With
End Sub

我需要将数据存储在数组中,然后将它们推送到数据库吗?

【问题讨论】:

With Sheets("Customers") 更改为With Sheets("Test")With Sheets("Information") @PaichengWu 那么我需要在 vba 中创建新模型吗?我不能在一个 Sub 下做吗?因为我想知道无论如何,我可以在 1 个函数下定义所有 3 张工作表吗?例如(“客户”和“信息”和“测试”),然后在按下按钮后将所有数据推送到数据库 - 像这样。 当然你可以把三个都放在一个子里。如果没有有关您的三张纸的布局和数据库架构的更多信息,我无法为您提供更多帮助。您应该了解如何插入工作表 Customers,然后扩展到第二和第三张工作表。 谢谢@PaichengWu 由于您有一个子单独在工作表Customers 上完成工作,因此为工作表test 修改它并为工作表information 进行修改。然后将三个 sub 合二为一。 【参考方案1】:

您不应该对要导出的每一行都使用插入查询。相反,如果您想手动执行,请打开记录集:

Sub Button1_Click()

Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim iRowNo As Integer
Dim sCustomerId, sFirstName, sLastName As String

With Sheets("Customers")

    'Open a connection to SQL Server
    conn.Open "Provider=SQLOLEDB;Data Source=TESTpc\SQLEXPRESS;Initial Catalog=ExcelSQLServerDemo;Trusted_connection=yes"
    conn.CursorLocation = adUseClient 'Use a client-side cursor
    rs.Open "SELECT * FROM dbo.Customers", conn, adOpenDynamic, adLockOptimistic 'Open the table into a recordset

   'Skip the header row
    iRowNo = 2

    'Loop until empty cell in CustomerId
    Do Until .Cells(iRowNo, 1) = ""
        rs.AddNew 'Add a new row
        rs!CustomerId = .Cells(iRowNo, 1) 'Set row values
        rs!FirstName = .Cells(iRowNo, 2)
        rs!LastName = .Cells(iRowNo, 3)
        rs.Update 'Commit changes to database, you can try running this once, or once every X rows
        iRowNo = iRowNo + 1
    Loop

    MsgBox "Customers Exported To Database"

    conn.Close
    Set conn = Nothing

    End With
End Sub

这有几个优点,包括但不限于提高性能、插入引用值的能力和提高稳定性。

【讨论】:

嗨@Erik von Asmuth,谢谢你的解释。我还没有执行你的解决方案。我有一个问题需要我的理解。在您的解决方案中,我可以看到您正在使用 select 语句。我的问题是,为什么应该使用 SELECT 语句而不是 INSERT,因为我将获取 excel 数据,然后将其传输到 SQL 服务器?另一个问题我还有 3 个带有 2 个外键的表。如果我想导出数据,那么我应该将数据推送到主键所在的第一个表吗?它还会链接到其他外键吗?我会执行一个子下的所有功能吗? 有很多问题需要评论。 select 语句打开一个记录集,其他代码向其中添加行。这些进一步的问题与此答案无关,因此我不会在这里作为评论回答它们。 von Asumth 谢谢你的解释,现在说得通了。再次感谢【参考方案2】:

使用Sql Server 64位或32位导入导出数据

第 1 步:

第 2 步:

第 3 步:

第 4 步:

第五步:

按照后续步骤进行

【讨论】:

感谢@RoverRoll,但有什么方法可以使用 VBA 代码而不是简单的 SQL Server 导入来做到这一点。因为,我目前正在学习

以上是关于如何将 Excel 数据从不同的工作表导出到 SQL-SERVER 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 MS Sql Server 存储过程导出到 excel 文件

如何使用多张工作表和不同的工作表名称将 dfs 导出为 excel

如何从访问将 2 个查询导出到 Excel 中的单个工作表

将 sql 数据从数据透视表存储过程导出到 excel

如何将sql表数据导出到excel工作表中?

将 Access 表导出到 Excel,但每个名称都有不同的工作表