У вас есть доступ к 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, вы должны построить двумерный массив, представляющий значения из вашего запроса.Затем вы находите эквивалентный диапазон размеров в своей рабочей таблице и устанавливаете значение этого диапазона в массив.Таким образом, вы сократили многие тысячи взаимодействий до одного.
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.