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. 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
    1. 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. 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

        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. 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. 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.  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. 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. 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 à 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. 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. 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. 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
                      2. 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