使用SQL数据填充Excel的更快方法

时间:2014-08-05 18:48:26

标签: sql-server excel-vba vba excel

将Excel 2010和SQLServer与ActiveX DataObjects 2.8一起使用

我正在从SQL数据库到Excel工作表检索大约100条记录(每次变量没有行)。查询本身运行得很快(我看到状态栏在返回时会发生变化),但是填充excel表需要很长时间 - 即使关闭ApplicationUpdating也是如此。

我正在做的是循环返回的记录集中的每一行并设置单个单元格的值。

是否有比遍历记录集中每个行和字段更快的方法。

以下是VBA的片段:

Application.StatusBar = "Getting shipment data..."
statement = "exec [SalesTax].[dbo].[GetShipmentsSummary]  " & _
"@JobNo = '" & JobNo & "'"

 Set rs = conn.Execute(statement)
    If (rs.BOF And rs.EOF) Then
        MsgBox ("No shippment records were found for JobNo: " & JobNo)
        Exit Sub
    End If
    rs.MoveFirst

    Application.StatusBar = "Got shipment data. Processing..."
    Application.ScreenUpdating = False
    ' Get each row and set cells to appropriate fields
    Do While Not rs.EOF
         ' Now insert the shipment data for this row
            Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo)
             CurrRange.Value = rs("State")
            Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo + 1)
             CurrRange.Value = CStr(rs("FirstZIP")) 
            Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo + 2)
             CurrRange.Value = CStr(rs("StateCount"))
            Set CurrRange = Sheets(WSName).Cells(CurrRowNo, CurrColNo + 3)
             CurrRange.Value = rs("StatePercentage")                
        CurrRowNo = CurrRowNo + 1
    rs.MoveNext
    Loop

 conn.Close
Set conn = Nothing
Set cmd = Nothing
Application.ScreenUpdating = True
Application.StatusBar = "Ready"

退出子

谢谢Mark

3 个答案:

答案 0 :(得分:3)

您可以使用

将完整记录集分配给数组,而不是遍历每条记录
arrData = rs.GetRows

但是,您可能需要转置此数组才能输出到Excel范围。

如果您只需要在工作表范围内使用

,则另一种选择
outputRng.CopyFromRecordset rs

其中outputRng是范围对象。

Ps - 重置状态栏应为Application.Statusbar = False

答案 1 :(得分:0)

编写电子表格的最快方法是直接编写csv文件 - 它只是一个文本文件,而且非常简单 - 你没有格式化,公式等等(虽然你没有出现使用它们)

但是,您绝不应该使用任何服务器上的Microsoft ActiveX控件。它不受支持cf. Limitations of Office Web Components when used server-side,如果您将其投入生产,您几乎肯定会遇到问题。

有一个商业库和免费库都不依赖于ms ActiveX,这使得这项任务在服务器或工作站上变得简单明了。 StackOverflow似乎对库和框架建议不屑一顾。

ADDED

大多数第三方库也比使用Office Automation快得多。

ADDED

我链接了错误的文章。应该是Considerations for server-side Automation of Office不要在服务器上使用办公自动化组件。我个人被要求由这样做的公司多次解决这个问题。它可以正常工作一段时间然后完全崩溃,但如果你有一个活动服务器,它很可能会很快遇到问题。

答案 2 :(得分:0)

您是否尝试过关闭自动计算?

关闭ScreenUpdating和Calculation

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

完成填充表格后重新打开它。

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

希望这有帮助。