Export Datagridview en Pdf

Résolu

Bonjour,

Je voudrais exporter mon datagridview en pdf  en tenant compte du filtre .

Ce dgv est filtré directement en Loop  , c'est à dire certaines colonnes et lignes sont invisibles .

Et aussi , il est variable d'un mois à l'autre  , ( colonnes et lignes sont variables ) .

j’utilise ce code mais le pdf créé est totalement vide .

Private Sub IMPRIMER_Click(sender As Object, e As EventArgs) Handles IMPRIMER.Click

        'Creating iTextSharp Table from the DataTable data

        Dim pdfTable As New PdfPTable(DataGritable.ColumnCount)
        pdfTable.DefaultCell.Padding = 3
        pdfTable.WidthPercentage = 30
        pdfTable.HorizontalAlignment = Element.ALIGN_LEFT
        pdfTable.DefaultCell.BorderWidth = 1

        'Adding Header row

        For Each column As DataGridViewColumn In DataGritable.Columns
            Dim cell As New PdfPCell(New Phrase(column.HeaderText))
            cell.BackgroundColor = New iTextSharp.text.BaseColor(240, 240, 240)
            pdfTable.AddCell(cell)
        Next
        'Adding DataRow

        For Each row As DataGridViewRow In DataGritable.Rows
            For Each cell As DataGridViewCell In row.Cells
                Dim val = If(Not String.IsNullOrEmpty(cell.ToString), cell?.Value?.ToString, String.Empty)
                pdfTable.AddCell(val)
            Next
        Next
        'Exporting to PDF
        Dim folderPath As String = "E:\testpdf"
        If Not Directory.Exists(folderPath) Then
            Directory.CreateDirectory(folderPath)
        End If
        Using stream As New FileStream(folderPath & "DataGridViewExport.pdf", FileMode.Create)
            Dim pdfDoc As New Document(PageSize.A2, 10.0F, 10.0F, 10.0F, 0.0F)
            PdfWriter.GetInstance(pdfDoc, stream)
            pdfDoc.Open()
            pdfDoc.Add(pdfTable)
            pdfDoc.Close()
            stream.Close()
        End Using

    End Sub

Pourriez vous me donner des pistes ?

Merci beaucoup


Windows / Firefox 91.0

14 réponses

  1. Oups !! j'ai honte , je l'avais déjà corrigé sur mon ordi professionnel

    Ça fonctionne sans erreur , je vais bidouiller pour que ça rentre en A4 vu que j'aurais que deux affichages : par semaine ou par mois

    pdf.SetDefaultPageSize(New iText.Kernel.Geom.PageSize(New iText.Kernel.Geom.Rectangle(1680, 1200)))

     En revanche , les couleurs et formats n'ont pas suivi. .

    aurais tu une piste?

    0
    1. ha non, je n'ai regardé que l'affichage en paysage.

      0
  2. Bonjour

    merci de ton aide wishmeril : On y arrive ..

    J'ai fait évoluer la solution en 4.8. mais j’obtiens l’erreur

    Une exception non gérée du type 'iText.Kernel.Exceptions.PdfException' s'est produite dans itext.kernel.dll

    d’où pourrait elle venir ?

    0
    1. oui, je te l'ai dit aux messages 9 et 15, il faut installer un package supplémentaire

      0
  3. En appliquant le code de stackoverflow et en modifiant la gestion des cellules vides (il faut envoyer string vide sinon ça décale tout).

    Après quelques ajustements pour trouver la bonne taille de page

            Dim saveFileDialog As SaveFileDialog = New SaveFileDialog()
            saveFileDialog.Filter = "PDF Files (*.pdf)|*.pdf"
            saveFileDialog.Title = "Save PDF File"
    
            If saveFileDialog.ShowDialog() = DialogResult.OK Then
                Dim filePath As String = saveFileDialog.FileName
                Dim writer As PdfWriter = New PdfWriter(filePath)
                Dim pdf As PdfDocument = New PdfDocument(writer)
    
                'ici on essaye le code de stackoverflow et après plusieurs test de résolution, car simplement en A4 ça ne rentre pas on à arrive à
                pdf.SetDefaultPageSize(New iText.Kernel.Geom.PageSize(New iText.Kernel.Geom.Rectangle(1680, 1200)))
    
                Dim document As Document = New Document(pdf)
                Dim table As iText.Layout.Element.Table = New iText.Layout.Element.Table(DataGridView1.ColumnCount)
    
    
                For Each column As DataGridViewColumn In DataGridView1.Columns
                    Dim cell As Cell = New Cell().Add(New Paragraph(column.HeaderText))
                    table.AddCell(cell)
                Next
    
                Dim texte As String
                For Each row As DataGridViewRow In DataGridView1.Rows
                    For Each cell As DataGridViewCell In row.Cells
                        texte = If(cell.Value IsNot Nothing, cell.Value.ToString(), "")
                        table.AddCell(texte)
                    Next
                Next
    
                document.Add(table)
                document.Close()
    
                'MessageBox.Show("Export to PDF completed successfully!")
                'c'est plus pratique pendant le débogge de visualiser directement le fichier
                Process.Start(filePath)
    
            End If
    

    0
    1. Bonsoir

      j'ai testé ton projet.

      Premier problème, il n'était pas en 4.8, mais en 4.6.

      Deuxième problème, tu n'as pas installé le package supplémentaire comme je te l'ai indiqué au message 9 https://forums.commentcamarche.net/forum/affich-37969784-export-datagridview-en-pdf#p37971195

      Troisième problème, toute la colonne "31/04/2024" de ton datagridview est vide, ors, tu n'as traité le cas des cellules vides.

      Avec cette boucle à partir de la ligne 76, c'est traité

                  For Each row As DataGridViewRow In DataGridView1.Rows
                      For Each cell As DataGridViewCell In row.Cells
                          If cell.Value IsNot Nothing Then
                              table.AddCell(cell.Value.ToString())
                          End If
                      Next
                  Next


      Une fois tout ça corrigé, ton code est fonctionnel.


      J'écris fonctionnel, car un pdf est généré, mais en portait.

      Dans le code, je ne trouve pas traces des 2 solutions proposées sur le post stackoverflow que je t'ai mis en lien au message 9 https://forums.commentcamarche.net/forum/affich-37969784-export-datagridview-en-pdf#p37972165

      Je veux bien essayer de t'aider, mais déjà que se remettre dans ton sujet une fois tous les 10 jours, ce n'est pas forcément évidement, mais si c'est pour me rendre compte que tu n'as rien appliqué de ce que je t'ai proposé, je me demande à quoi ça sert ?


      0
      1. Bonjour à toutes et a tous

        Je vous souhaite une belle et heureuse année 2024 remplie de succès dans toutes vos entreprises .

        Toujours dans la suite de ma problématique d'export , je n'ai toujours pas  "réussi " a exporter le datagridview dynamique en pdf tout en conservant son format , police et couleur

        J'ai construit une solution qui resume toute ma problématique avec un extrait de code avec itext7

        Pourriez vous voir et y apporter des pistes de corrections

        le lien a télécharger :

        https://www.transfernow.net/dl/202401095YqcX1Ld

        merci beaucoup

        0
        1. Bonjour

          En changeant le .NET framework à 4.8.1 j'ai finalement réussi a installer Itext7 via Nuget.

          En 4.8, mais quel était il précédent? Pour rappel, 4.X est obsolète. W11 ne garantit plus le fonctionnement de logiciels écrits pour 4.X

          j'ai abandonné l'export direct du datagritable dynamique en pdf (trop complexe)  pour faire un export d'image  que je positionne sur un pdf

          Le code que tu as posté au message 6 fonctionne chez moi, framework 6. Je ne vois pas en quoi il est complexe. Il présente l'avantage que les valeurs sont sélectionnables contrairement à une image.


          Pour l'orientation en portrait, tu devrais trouver ton bonheur ici https://stackoverflow.com/questions/2019246/itextsharp-table-in-landscape


          0
          1. Bonjour

            En changeant le .NET framework à 4.8.1 j'ai finalement réussi a installer Itext7 via Nuget.

            Toutes les références maintenant sont installées .

            j'ai abandonné l'export direct du datagritable dynamique en pdf (trop complexe)  pour faire un export d'image  que je positionne sur un pdf .

            le résultat est plutôt satisfaisant  ( à voir à l'impression ) .

            Seulement je voudrais que le pdf créé soit en mode paysage,  auriez vous une idée ?

            Ci dessous le code qui fonctionne .

            Imports iText.Kernel.Pdf
            Imports iText.Layout
            Imports iText.Layout.Element
            Imports iText.IO.Font
            Imports iText.IO.Font.Constants
            Imports iText.Kernel.Font
            Imports iText.Kernel.Colors
            Imports iText.Layout.Properties
            Imports iText.IO.Image
            Imports iText.Kernel.Pdf.Action
            Imports iText.Kernel.Pdf.Canvas.Draw
            
            
            Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            
                    Dim saveFileDialog As SaveFileDialog = New SaveFileDialog()
                    saveFileDialog.Filter = "PDF Files (*.pdf)|*.pdf"
                    saveFileDialog.Title = "Save PDF File"
            
                    If saveFileDialog.ShowDialog() = DialogResult.OK Then
                        Dim filePath As String = saveFileDialog.FileName
                        Dim writer As PdfWriter = New PdfWriter(filePath)
                        Dim pdf As PdfDocument = New PdfDocument(writer)
                        Dim document As Document = New Document(pdf)
            
                        Dim r As Integer = 0
                        For i = 0 To DataGritable.Rows.Count - 1
                            If DataGritable.Rows(i).Visible = True Then
                                r = r + 1
                            End If
                        Next
                        'Resize DataGridView to full height.
                        Dim height As Integer = DataGritable.Height
                        DataGritable.Height = r * 50
            
                        'Create a Bitmap and draw the DataGridView on it.
                        Dim bitmap As Bitmap = New Bitmap(Me.DataGritable.Width, Me.DataGritable.Height)
                        DataGritable.DrawToBitmap(bitmap, New System.Drawing.Rectangle(0, 10, DataGritable.Width, DataGritable.Height))
                        'Resize DataGridView back to original height.
                        DataGritable.Height = height
                        ' DataGritable.Width = width
            
                        'Save the Bitmap to folder
                        Dim Filename As String = System.IO.Path.GetFileName(My.Application.Info.DirectoryPath & "\bitmap" & "\" & "image.jpg")
                        bitmap.Save(Filename)
                        ''Creating an ImageData object 
                        Dim header As Paragraph = New Paragraph("Edition").SetTextAlignment(TextAlignment.LEFT).SetFontSize(12)
                        Dim newline As Paragraph = New Paragraph(New Text(vbLf))
                        document.Add(newline)
                        document.Add(header)
                        'Dim subheader As Paragraph = New Paragraph("SUB HEADER").SetTextAlignment(TextAlignment.CENTER).SetFontSize(15)
                        '  document.Add(subheader)
                        'Dim ls As LineSeparator = New LineSeparator(New SolidLine())
                        ' document.Add(ls)
                        Dim paragraph1 As Paragraph = New Paragraph("Edité le:" & Now)
                        document.Add(paragraph1)
                        Dim img As Image = New Image(ImageDataFactory.Create(Filename)).SetTextAlignment(TextAlignment.CENTER)
                        document.Add(img)
            
                        'Dim n As Integer = pdf.GetNumberOfPages()
                        ' For i As Integer = 1 To n
                        'document.ShowTextAligned(New Paragraph(String.Format("page" & i & " of " & n)), 559, 806, i, TextAlignment.RIGHT, VerticalAlignment.TOP, 0)
                        ' Next
            
                        document.Close()
                        MessageBox.Show("Export to PDF completed successfully!")
                    Else
                        Exit Sub
                    End If
                End Sub
            0
            1.  sauf erreur de ma part , itext7 ne s'est pas installé via Nuget .

              Alors, le souci vient probablement de ça.

              Nuggets ajoute la référence à ton projet, si tu le télécharges "à la main", il faut que tu le fasses de ton coté.

              Dans le menu projet -> Ajouter une référence de Projet, bouton parcourir et tu vas chercher la librairie


              0
              1. Re..

                j'ai bien désinstallé Itexsharp et en effet  sauf erreur de ma part , itext7 ne s'est pas installé via Nuget .

                J'ai téléchargé le itext7.bouncy-castle-adapter.8.0.2.nupkg mais comment le référencer dans mon projet ?

                Ci-dessous les erreurs que j'obtiens

                merci

                0
                1. Bonjour

                  Ce qui serait plus utile que ton image, ce serait le message d'erreur associé à chaque ligne en erreur.

                  Chez moi, je n'ai pas ces erreurs.

                  Celles que j'avais concernaient DataGridTable qui n'existe pas chez moi, j'ai supposé que c'est le nom que tu as donné à ton DataGridView (DataGridView1 précédemment).

                  En renommant avec le nom de mon DataGridView, je n'ai plus d'erreur de pré-compilation.

                  J'en ai à l'exécution, mais on verra ça dans un second temps.


                  0
                  1. PS as-tu désinstallé iTextSharp avant d'installer iText7 ?

                    0
                2. Bonjour

                  Je ne pensais pas que ce serait si laborieux pour exporter le datagridview dynamique en pdf .

                  j'ai récupéré ce code qui utilise itext7 que j'ai chargé via Nuget

                  Mis les imports.

                  Imports iText.Kernel.Pdf
                  Imports iText.Layout
                  Imports iText.Layout.Element
                  Imports iText.IO.Font
                  Imports iText.IO.Font.Constants
                  Imports iText.Kernel.Font
                  Imports iText.Kernel.Colors

                  J(obtiens des erreurs quasi partout .( Voir photo en pj)

                  Merci de votre aide .

                  Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click
                          Dim saveFileDialog As SaveFileDialog = New SaveFileDialog()
                          saveFileDialog.Filter = "PDF Files (*.pdf)|*.pdf"
                          saveFileDialog.Title = "Save PDF File"
                  
                          If saveFileDialog.ShowDialog() = DialogResult.OK Then
                              Dim filePath As String = saveFileDialog.FileName
                              Dim writer As PdfWriter = New PdfWriter(filePath)
                              Dim pdf As PdfDocument = New PdfDocument(writer)
                              Dim document As Document = New Document(pdf)
                              Dim table As iText.Layout.Element.Table = New iText.Layout.Element.Table(DataGritable.ColumnCount)
                  
                              For Each column As DataGridViewColumn In DataGritable.Columns
                                  Dim cell As Cell = New Cell().Add(New Paragraph(column.HeaderText))
                                  table.AddCell(cell)
                              Next
                  
                              For Each row As DataGridViewRow In DataGritable.Rows
                  
                                  For Each cell As DataGridViewCell In row.Cells
                                      table.AddCell(cell.Value.ToString())
                                  Next
                              Next
                  
                              document.Add(table)
                              document.Close()
                              MessageBox.Show("Export to PDF completed successfully!")
                          End If
                      End Sub
                  
                  0
                  1. Re..

                    J'ai téléchargé la version conseillé itext7 puis désinstallé itextsharp .

                    Est ce que itext7 fait l'export et la création du pdf ?

                    0
                    1. Je n'ai essayé ni l'un ni lautre.

                      0
                  2. Bonjour

                    En effet j’utilise la version dépréciée de itextsharp.

                     je fais la migration vers la bonne version et te tiens au courant

                    merci

                    0
                    1. Bonjour

                      dans un commentaire, on devine que tu utilises itextsharp.

                      Peux-tu confirmer dans la capture ci-dessous duquel il s'agit ?

                      À noter que la version "originale" est donnée pour dépréciée. Du coup, il n'est pas conseiller de l'utiliser.

                      D'autre part, as-tu exécuté en pas à pas en espionnant les variables pour voir ce qui se passe ?


                      0