使用数据库中的信息创建Excel文件

时间:2018-12-05 04:02:07

标签: excel vb.net for-loop

我有一个查询,返回的内容如下:

1    2    3    4    5    6    7
A.   B.   C.   D.   E.   F.   G.
Etc...
Etc...
N rows

我将查询存储在数据集上。然后,我使用类似以下的内容创建Excel文件:

Sql=“select * from table”
Dim cmd As New SqlDataAdapter(Sql, con)
Dim ds As New DataSet
cmd.Fill(ds)

For i=0 To Tables(0).Rows.Count - 1
    For x=0 To ds.Tables(0).Columns.Count - 1
        ExcelFile.Cells(i+1;x+1)=ds.Tables(0).Rows(i).Item(j)
    Next
Next

代码工作正常,除了我还需要写列标题名称(1、2、3、4等)。我的第一个问题是如何添加标题?

主要问题...查询有时会返回80k以上的结果,因此,按照for循环逻辑,我的代码将为每一列运行80k次(在本例中为7次),这将给我一个缓慢的结果。

还有另一种快速填充和Excel文件的方法吗?还是这是最好的方法?

2 个答案:

答案 0 :(得分:1)

您可以访问ColumnName中每个Column的{​​{1}}属性。例如,要仅添加标题而对代码进行尽可能少的修改,则可以执行以下操作:

DataTable

不过,您应该对此有所关注。 Excel自动化的首要原则是实际与Excel进行尽可能少的交互,因为每次交互都非常昂贵。

假设您使用的是常规Office Interop,则应构建一个二维数组,表示查询中的值。然后,您在工作表中找到一个等效的大小范围,并将该范围的值设置为数组。这样,您就可以将成千上万的互动减少到一个。

'Write ColumnName to the corresponding cell in row 1
For x=0 To ds.Tables(0).Columns.Count - 1
    ExcelFile.Cells(1, x+1) = ds.Tables(0).Columns(x).ColumnName
Next

'Modded to start at the second row and fix index variable
For i=1 To Tables(0).Rows.Count - 1
    For x=0 To ds.Tables(0).Columns.Count - 1
        ExcelFile.Cells(i+1, x+1) = ds.Tables(0).Rows(i).Item(x)
    Next
Next

此外,如果您实际上使用的是Excel Interop或类似NetOffice的包装,则应查看EPPlus并查看它是否满足您的要求。这是一个可与OfficeOpenXML一起使用的帮助程序库,甚至不需要安装Excel。

答案 1 :(得分:0)

我使用以下内容:

Dim sSql As String
Dim tbl As ListObject

'Declare a Connection object
Dim cnDB As New ADODB.Connection

'Declare a Recordset Object
Dim rs As ADODB.Recordset

' Housekeeping, set the connection strings
Set cnn = New ADODB.Connection
cnn.Provider = "MSDASQL"
cnn.CommandTimeout = 100

Set tbl = ActiveSheet.ListObjects("Lookup")
With tbl.DataBodyRange
    If .Rows.Count > 1 Then
        .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count).Rows.Delete
    End If
End With

' Connect to the database and paste new data
cnn.ConnectionString = "driver={};server={};uid={};pwd={};database={}"
sSql = "SELECT BLAH BLAH "
cnn.Open
Set rs = cnn.Execute(sSql)

ThisWorkbook.Worksheets("Lookup").Range("A2").CopyFromRecordset rs
cnn.Close