Export Datagridview en Pdf

Résolu
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 - 26 déc. 2023 à 18:26
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 - 13 janv. 2024 à 20:55

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

A voir également:

14 réponses

Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
27 déc. 2023 à 13:42

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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
27 déc. 2023 à 15:34

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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
27 déc. 2023 à 16:05

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
27 déc. 2023 à 17:35

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

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
27 déc. 2023 à 17:37

Apparemment oui https://www.codeguru.com/dotnet/generating-a-pdf-document-using-c-net-and-itext-7/

tu peux convertir les  exemples de code avec un convertisseur en ligne

0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
29 déc. 2023 à 11:43

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
29 déc. 2023 à 13:21

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
29 déc. 2023 à 13:23

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

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
29 déc. 2023 à 13:37

J'ai résolu mon erreur à l'exécution en installant un package complémentaire itext7.bouncy-castle-adapter comme indiqué là https://stackoverflow.com/questions/76260218/how-do-i-resolve-unknown-pdfexception-when-using-itext7-in-net-maui

Pour le coup, les nuggets étaient justement censé installer toutes leurs dépendances d'eux-mêmes. Ils ont merdé ches Apryse

0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
29 déc. 2023 à 14:13

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
29 déc. 2023 à 14:49

 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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
31 déc. 2023 à 13:59

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
31 déc. 2023 à 15:32

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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
9 janv. 2024 à 15:59

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
12 janv. 2024 à 23:35

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
13 janv. 2024 à 10:36

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
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
13 janv. 2024 à 19:13

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
13 janv. 2024 à 20:11

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

0
julia Namor Messages postés 524 Date d'inscription jeudi 27 mars 2014 Statut Membre Dernière intervention 13 janvier 2024 33
13 janv. 2024 à 20:47

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
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
13 janv. 2024 à 20:55

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

0