Exporter vers Excel avec le text d'en-tête

J'ai un code qui devrait inclure le text d'en-tête lors de l'export vers 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 

Toutefois, ce code remplace la première ligne de données par le text de l'en-tête au lieu de l'insert ci-dessus. Si je supprime l'instruction If qui extrait le text de l'en-tête, j'obtiens toutes les lignes, mais je ne reçois pas de text d'en-tête.

 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 

Des idées sur la façon de résoudre ce problème?

Après avoir suivi votre code, il est clair que vous avez un problème d'indexing dans les deux for loops. Il semble que le code que vous avez fourni manque la première rangée de données.

Comme vous l'avez remarqué:

Ce code remplace la première ligne de données par le text de l'en-tête au lieu de l'insert au-dessus

Ce n'est pas correct, il ne remplace pas la ligne, il ne fait que sauter la première rangée de données dans DataGridView . Voici votre code à expliquer.

 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 

Fondamentalement, ces lignes suivent les lignes puis les colonnes. Le problème se trouve dans l'instruction If et l'indice i . Dans cette déclaration If , vous vérifiez si c'est la première fois que vous obtenez les en-têtes. Si c'est la première fois que vous écrivez les en-têtes pour excel et continuer. Cela va sauter la première ligne de données car la variable de boucle i est utilisée comme index dans les lignes DataGridView avec l'affectation:

 worksheet.Cells(cellRowIndex, cellColumnIndex) = DataGridView1.Rows(i).Cells(j).Value 

En entrant dans la boucle j , la première fois autour de i est zéro (0). Un contrôle est effectué avec cellRowIndex pour déterminer si les en-têtes doivent être émis. Dans ce cas, ils … les en-têtes sont sortis, puis quittez-le if et faites une nouvelle sauvegarde vers l'en-tête suivant. Lorsque tous les en-têtes sont sortis, vous quittez la boucle j et faites une nouvelle sauvegarde sur la boucle i . Cela augmentera i à 1 et entre dans la boucle j … Puisque i déjà été 0 lorsque les en-têtes ont été sortis, nous ignorerons la ligne 0 dans DataGridView . J'espère que cela a du sens.

Une solution simple pour ce que vous avez consiste à simplement commencer i à -1 avec:

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

Cela résoudra le problème que vous rencontrez, mais le code n'est pas facile à suivre. Je recommand d'utiliser une boucle foreach pour boucler les lignes DataGridView et séparer la sortie de la colonne de la sortie des lignes. Cela crée deux loops, mais la première boucle ne bougera qu'une seule fois pour append les en-têtes. La prochaine boucle passe par toutes les lignes. Cela rendra l'indexing plus facile à gérer et plus facile à lire dans le futur.

 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.ToSsortingng Next End If rowIndex += 1 Next 

J'espère que cela t'aides.

Le code ci-dessous crée un file Excel avec l'en-tête de DataGridView. Je l'ai testé dans Visual Studio 2010. Tout d'abord, vous devez append la reference de l'assemblage Microsoft Office.

  • Microsoft.Office.Interop.Excel (Version – 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.ToSsortingng() 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