我有一个查询返回如下内容:
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文件的方法吗?或者这是最好的方法?
您可以访问ColumnName
每个属性Column
在你的DataTable
。例如,要在尽可能少地修改代码的情况下添加标头,您可以这样做:
'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 自动化的第一条规则是尽可能少地实际与 Excel 交互,因为每次交互都非常昂贵。
假设您使用的是常规 Office Interop,您应该构建一个二维数组来表示您的查询中的值。然后在工作表中找到等效的大小范围,并将该范围的值设置为数组。通过这种方式,您可以将成千上万的交互缩减为一个。
Dim rowCount = ds.Tables(0).Rows.Count
Dim colCount = ds.Tables(0).Columns.Count
Dim ws = ExcelFile
Dim valueSet(,) As Object
ReDim valueSet(rowCount - 1, colCount - 1)
For row = 0 To rowCount - 1
For col = 0 To colCount - 1
valueSet(row, col) = ds.Tables(0).Rows(row).Item(col)
Next
Next
'Set the entire set of values in a single operation
ws.Range(ws.Cells(1, 0), ws.Cells(rowCount, colCount).Value = valueSet
此外,如果您实际上正在使用 Excel Interop 或它的包装器,例如NetOffice,您应该查看EPPlus并查看它是否满足您的需求。它是一个可与 OfficeOpenXML 配合使用的帮助程序库,甚至不需要安装 Excel。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句