我有一个查询,返回的内容如下:
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文件的方法吗?还是这是最好的方法?
答案 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