Export Datagridview en Pdf
RésoluUtilisateur anonyme -
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
- Export Datagridview en Pdf
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Save as pdf office 2007 - Télécharger - Bureautique
- Télécharger dictionnaire larousse pdf gratuit - Télécharger - Dictionnaires & Langues
- Notices gratuites pdf - Guide
- Pdf watermark remover - Télécharger - PDF
14 réponses
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 ?
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 ?
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour
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.
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
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
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
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
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
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 ?
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
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?