После трассировки кода ясно, у вас возникли проблемы индексации в двух for
петель. Похоже, что в коде, который вы указали, отсутствует первая строка данных.
Как прокомментировал:
этот код заменяет первую строку данных с текстом заголовка вместо вставки его выше ...
Это не правильно, это не заменяет строка просто пропускает первую строку данных в DataGridView
. Ниже приведен ваш код.
For i As Integer = 0 To DataGridView1.Rows.Count - 2
For j As Integer = 0 To DataGridView1.Columns.Count - 1
If cellRowIndex = 1 Then
worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Columns(j).HeaderText
Else
worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Rows(i).Cells(j).Value
End If
cellColumnIndex += 1
Next
cellColumnIndex = 1
cellRowIndex += 1
Next
В основном это петли через строки, а затем столбцы. Проблема заключается в заявке If
и индексе i
. В этом заявлении If
вы проверяете, действительно ли это первый раз, чтобы получить заголовки. Если в первый раз вы пишете заголовки, чтобы преуспеть и продолжить. Это собирается пропустить первую строку данных, так как переменная i
цикла используются в качестве индекса в DataGridView строки с заданием:
worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Rows(i).Cells(j).Value
При входе в j
петли в первый раз вокруг i
равно нуль (0) , Проверка производится с помощью cellRowIndex
, чтобы определить, нужно ли выводить заголовки. В этом случае они ... выводятся заголовки, затем выходят из этого if
и возвращаются к следующему заголовку. Когда все заголовки выводятся, вы выходите из цикла j
и возвращаете петлю до i
. Это увеличит i
до 1 и введите цикл j
... Поскольку i
уже был 0, когда выведены заголовки, мы пропустим/пропустим строку 0 в DataGridView
. Я надеюсь в этом есть смысл.
Простое решение для того, что вы должны были бы просто начать i
на -1 с:
For i As Integer = -1 To DataGridView1.Rows.Count - 2
Это позволит решить проблему, которую вы испытываете, однако код не легко следовать.Я рекомендую использовать цикл foreach
для прокрутки строк DataGridView
и разделения вывода столбца на выходе строк. Это создает две петли, но первый цикл будет только петля один раз, чтобы добавить заголовки. Следующий цикл проходит через все строки. Это упростит обработку индексации и упростит чтение в будущем.
For Each column In DataGridView1.Columns
worksheet.Cells(1, column.Index + 1).Value = column.Name
Next
Dim rowIndex = 2
For Each row As DataGridViewRow In DataGridView1.Rows
If Not row.IsNewRow Then
For colIndex As Integer = 0 To DataGridView1.Columns.Count - 1
worksheet.Cells(rowIndex, colIndex + 1).Value = row.Cells(colIndex).Value.ToString
Next
End If
rowIndex += 1
Next
Надеюсь, это поможет.
Вау, это должен быть самый полный и хорошо объясненный ответ, который я видел до сих пор в Stackoverflow. Спасибо! Я даже начинаю понимать, что я здесь делаю :) Вы упомянули две петли foreach; Должен ли я разместить ваш цикл до существующего цикла? – LarsS
Извините, мой плохой. Я вижу, что в вашем коде есть две петли. Too triggerhappy ...;) – LarsS
Последний бит кода должен сделать трюк. Первый цикл для заголовков, следующий для строк. – JohnG