Экспорт в 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 

Любые идеи о том, как это решить?

После отслеживания кода ясно, что у вас есть проблема индексирования в двух циклах. Похоже, что в коде, который вы указали, отсутствует первая строка данных.

Как вы прокомментировали:

этот код заменяет первую строку данных текстом заголовка вместо того, чтобы вставлять его выше

Это неверно, он не заменяет строку, которая просто пропускает первую строку данных в 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 чтобы определить, нужно ли выводить заголовки. В этом случае они … заголовки выводятся, а затем выходят из этого цикла и возвращаются к следующему заголовку. Когда все заголовки выводятся, вы выходите из цикла j и возвращаете петлю к i му циклу. Это увеличит i до 1 и войдет в j цикл … Так как i уже было 0, когда выведены заголовки, мы пропустим / пропустим строку 0 в DataGridView . Я надеюсь в этом есть смысл.

Простое решение для того, что у вас есть, – просто запустить i в -1 с помощью:

 For i As Integer = -1 To DataGridView1.Rows.Count - 2 

Это решит проблему, с которой вы сталкиваетесь, однако код не просто следовать. Я рекомендую использовать цикл foreach для циклического DataGridView строкам 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 
Interesting Posts

Автофиты неспецифических столбцов ячейки Excel VBA

Excel VBA – поиск в цикле

Объявить словарь без Microsoft Scripting Runtime

Открытие отличных документов из Интернета неуклюже

Обновление и перемещение строк столбцов на основе совпадающих данных

Excel VBA: проблема при использовании события Aftersave с событием BeforeSave

количество значений в диапазоне, полученных с помощью IF

Как подсчитать количество разных дат в одном столбце?

Изменить формулу Excel для суммирования только видимых ячеек

где мои ошибки?

Как увеличить значение строки в формуле excel INDEX с помощью дескриптора заполнения?

vLookup Соответствует разному массиву поиска

Скопируйте строки из одного файла excel в другой и выделите row.cells в правой колонке

Excel – вывод результатов расчета с нескольких входов

Необходимо скопировать строки из одной ws в другую на основе нескольких значений в одном столбце

Давайте будем гением компьютера.