Экспорт в Excel с текстом заголовка
У меня есть код, который должен включать текст заголовка при экспорте в Excel.
For i As Integer = 0 To DataGridView2.Rows.Count - 2
For j As Integer = 0 To DataGridView2.Columns.Count - 1
' Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check.
If cellRowIndex = 1 Then
worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView2.Columns(j).HeaderText
Else
worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView2.Rows(i).Cells(j).Value
End If
cellColumnIndex += 1
Next
cellColumnIndex = 1
cellRowIndex += 1
Next
Однако этот код заменяет первую строку данных текстом заголовка, а не вставляет его выше. Если я удаляю оператор If, который извлекает текст заголовка, я получаю все строки, но я не получаю текст заголовка.
For i As Integer = 0 To DataGridView2.Rows.Count - 2
For j As Integer = 0 To DataGridView2.Columns.Count - 1
worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView2.Rows(i).Cells(j).Value
cellColumnIndex += 1
Next
cellColumnIndex = 1
cellRowIndex += 1
Next
Есть идеи, как это решить?
2 ответа
После трассировки вашего кода становится ясно, что у вас проблема с индексацией 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
Надеюсь это поможет.
Ниже код создает файл Excel с заголовком из DataGridView. Я протестировал его в Visual Studio 2010. Сначала необходимо добавить ссылку на сборку Microsoft Office.
Microsoft.Office.Interop.Excel (версия - 12.0.0.0)
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim xlApp As Microsoft.Office.Interop.Excel.Application Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet Dim misValue As Object = System.Reflection.Missing.Value Dim i As Integer Dim j As Integer xlApp = New Microsoft.Office.Interop.Excel.Application xlWorkBook = xlApp.Workbooks.Add(misValue) xlWorkSheet = xlWorkBook.Sheets("sheet1") For i = 0 To DataGridView1.RowCount - 2 For j = 0 To DataGridView1.ColumnCount - 1 For k As Integer = 1 To DataGridView1.Columns.Count xlWorkSheet.Cells(1, k) = DataGridView1.Columns(k - 1).HeaderText xlWorkSheet.Cells(i + 2, j + 1) = DataGridView1(j, i).Value.ToString() Next Next Next xlWorkSheet.SaveAs("C:\vbToexcel.xlsx") xlWorkBook.Close() xlApp.Quit() releaseObject(xlApp) releaseObject(xlWorkBook) releaseObject(xlWorkSheet) MsgBox("File successfully created - C:\vbToexcel.xlsx") End Sub Private Sub releaseObject(ByVal obj As Object) Try System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing Catch ex As Exception obj = Nothing Finally GC.Collect() End Try End Sub