📜  通过 Excel 获取数据:比较运行时(1)

📅  最后修改于: 2023-12-03 15:28:23.417000             🧑  作者: Mango

通过 Excel 获取数据:比较运行时

在许多数据处理应用中,Excel 是最常用的工具之一。然而,在访问大量数据时,Excel 可能会变得非常缓慢。这时候,我们可以使用不同的方法来获取Excel数据,比较它们的运行时,以找到最佳方案。

方法一:使用 VBA

在 Excel 中,我们可以通过编写 VBA 代码来获取数据。以下是一个简单的示例程序:

Sub GetData()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim rng As Range
    
    Set wb = ThisWorkbook
    Set ws = wb.Worksheets(1)
    Set rng = ws.Range("A1:B10")
    
    '获取数据
    For Each cell In rng
        Debug.Print cell.Value
    Next cell
    
End Sub

这段代码将获取第一个工作表中的 A1:B10 单元格范围中的所有数据,然后在 VBA 调试窗口中打印出来。

运行时测试表明,对于 10 个单元格的范围,此方法在我的计算机上需要 0.12 秒左右。

方法二:使用 Power Query

Power Query 是 Excel 中的一个插件,可用于获取和转换数据。此插件可通过 Excel 菜单“数据”>“获取和转换数据”来访问。

使用 Power Query 获取数据的步骤如下:

  1. 选择“从文件”>“从工作簿”>“从工作簿”。
  2. 选择 Excel 文件和工作表,然后点击“确定”。
  3. 在“查询编辑器”中,选择要获取的数据范围。
  4. 转换和清理数据,如果需要。
  5. 关闭“查询编辑器”,并将数据导入 Excel 工作表。

使用 Power Query 获取数据的代码片段如下:

Sub GetData()

    Dim ws As Worksheet
    Dim connection As WorkbookConnection
    Dim command As String
    
    Set ws = ThisWorkbook.Worksheets(1)
    command = "SELECT * FROM [Sheet1$A1:B10]"
    
    '获取数据
    Set connection = wb.Connections.Add2( _
        "My Connection", _
        "OLEDB;" & _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & ActiveWorkbook.FullName & ";" & _
        "Extended Properties=" & Chr(34) & "Excel 12.0 Xml;HDR=NO" & Chr(34) & ";" & _
        "Persist Security Info=False")
    connection.OLEDBConnection.CommandText = command
    connection.Refresh
    
    '导入数据
    ws.ListObjects.Add _
        SourceType:=xlSrcConnection, _
        Source:=connection, _
        Destination:=ws.Range("A1:B10")
    
End Sub

运行时测试表明,对于 10 个单元格的范围,此方法在我的计算机上需要约 0.25 秒。

方法三:使用 ADO.NET

AD0.NET 是 .NET Framework 中的一个组件,可用于访问各种数据源(包括 Excel)。

要使用 ADO.NET 获取 Excel 数据,我们需要添加对“System.Data.OleDb”命名空间的引用。以下是一个简单的示例程序:

Sub GetData()

    Dim conn As New OleDbConnection
    Dim cmd As New OleDbCommand
    Dim adapter As New OleDbDataAdapter
    Dim dt As New DataTable
    
    conn.ConnectionString = _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & ActiveWorkbook.FullName & ";" & _
        "Extended Properties=" & Chr(34) & "Excel 12.0 Xml;HDR=NO" & Chr(34) & ";" & _
        "Persist Security Info=False"
    conn.Open
    
    cmd.Connection = conn
    cmd.CommandText = "SELECT * FROM [Sheet1$A1:B10]"
    
    adapter.SelectCommand = cmd
    adapter.Fill(dt)
    
    '关闭连接
    conn.Close
    
    '输出数据
    For Each row In dt.Rows
        For Each col In dt.Columns
            Debug.Print row(col.ColumnName)
        Next col
    Next row
    
End Sub

运行时测试表明,对于 10 个单元格的范围,此方法在我的计算机上需要约 0.05 秒。

结论

根据以上测试,可以得出以下结论:

  • 当处理大量数据时,使用 ADO.NET 是最快的方法。
  • Power Query 的运行时略慢。
  • VBA 可能对小型任务或快速原型非常有用,但处理大量数据时会非常缓慢。

因此,在编写 Excel 应用程序时,我们应该根据任务的规模和运行时间要求来选择合适的工具和技术。