Экспорт в 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
    
Другие вопросы по тегам