IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Transférer un datagridview dans un PDF


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 34
    Par défaut Transférer un datagridview dans un PDF
    Bonjour ! Alors j'ai actuellement un problème vraiment gênant !

    J'ai un datagridview qui contient une multitude de données, le problème c'est que après la requête SQL, j'ai un tableau que je modifie pour avoir une belle mise en forme ! Le problème c'est que je lis le tableau pour le copier dans un PDF, mais le code me copie le datagridview sans les modifs que j'ai fais juste après... Du coup normalement j'ai ceci :

    http://www.cjoint.com/doc/16_06/FFwh...Z_sfesfesf.PNG

    Mais ça me donne cela :

    http://www.cjoint.com/doc/16_06/FFwhr72NOaZ_open.PNG

    L'ordre des colonnes est perdu, le format des dates, heures, arrondis avant la virgule...

    Voilà mon code, ceci est mon bouton qui lance l'écriture dans le PDF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     Private Sub Bt_calcul_Click(sender As System.Object, e As System.EventArgs) Handles Bt_calcul.Click
            If Form4_Ticket.Dtgdv_ticket.ColumnCount = 0 Then
                MsgBox("Veuillez choisir une entité et lancer une recherche svp")
                Exit Sub
            Else
                Dim pdfTable As New PdfPTable(Form4_Ticket.Dtgdv_ticket.ColumnCount)
                pdfTable.DefaultCell.Padding = 3
                pdfTable.HorizontalAlignment = Element.ALIGN_CENTER
                pdfTable.DefaultCell.NoWrap = True
     
                For Each column As DataGridViewColumn In Form4_Ticket.Dtgdv_ticket.Columns
                    Dim cell As New PdfPCell(New Phrase(column.HeaderText))
                    cell.BackgroundColor = New iTextSharp.text.BaseColor(240, 240, 240)
                    pdfTable.AddCell(cell)
                Next
     
                Dim i As Integer = 0
                For Each row As DataGridViewRow In Form4_Ticket.Dtgdv_ticket.Rows
                    If Not Form4_Ticket.Dtgdv_ticket.Rows.Count = i + 1 Then
                        For Each cell As DataGridViewCell In row.Cells
                            If Not cell.Value.ToString = vbNullString Then
                                Dim cellPDF As New PdfPCell(New Phrase(cell.Value.ToString()))
                                pdfTable.AddCell(cellPDF)
                            Else
                                Exit For
                            End If
                        Next
                        i = i + 1
                    Else
                        Exit For
                    End If
                Next
     
                Dim widths(Form4_Ticket.Dtgdv_ticket.Columns.Count - 1) As Integer
                For Each col As DataGridViewColumn In Form4_Ticket.Dtgdv_ticket.Columns
                    widths(col.Index) = col.Width
                Next
                pdfTable.SetWidths(widths)
     
                Dim folderPath As String = "C:\Users\degecom\Desktop\PDF TEST"
                If Not Directory.Exists(folderPath) Then
                    Directory.CreateDirectory(folderPath)
                End If
                Using stream As New FileStream(folderPath & "\test.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
     
                AxAcroPDF1.src = "C:\Users\degecom\Desktop\PDF TEST\test.pdf"
            End If
        End Sub
    Et mes modifs du datagridview qui sont bien sûr avant le bouton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
            Dtgdv_ticket.Columns("Type").DisplayIndex = 1
            Dtgdv_ticket.Columns("T.actiontime / 60").HeaderText = "Duré ticket (min)"
            Dtgdv_ticket.Columns("TT.actiontime / 60").HeaderText = "Duré tache (min)"
            Dtgdv_ticket.Columns("date").DefaultCellStyle.Format = "d"
            Dtgdv_ticket.Columns("T.actiontime / 60").DefaultCellStyle.Format = "n0"
            Dtgdv_ticket.Columns("TT.actiontime / 60").DefaultCellStyle.Format = "n0"
            Dtgdv_ticket.Columns("name").HeaderText = "Titre"
            Dtgdv_ticket.Columns("date1").HeaderText = "Date ticket"
            Dtgdv_ticket.Columns("content").HeaderText = "Description ticket"
            Dtgdv_ticket.Columns("content1").HeaderText = "Description tache"
            Dtgdv_ticket.Columns("date1").HeaderText = "Date tache"
            Dtgdv_ticket.Columns("date2").HeaderText = "Heure de la tache"
     
            'Dtgdv_ticket.DefaultCellStyle.WrapMode = DataGridViewTriState.True
            Dtgdv_ticket.Columns("date").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader
            Dtgdv_ticket.Columns("date1").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader
            Dtgdv_ticket.Columns("date2").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader
            Dtgdv_ticket.Columns("T.actiontime / 60").AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
            Dtgdv_ticket.Columns("TT.actiontime / 60").AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
            Dtgdv_ticket.Columns("Type").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Par défaut
    Bonjour,

    J'ai lu en diagonale, mais j'ai l'impression que tu met en forme ton datagrid "Dtgdv_ticket" et que c'est tableau et que c'est ce tableau "pdfTable" que tu envoie au pdf.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 34
    Par défaut
    Bonjour, merci de votre réponse (:
    Oui désolé j'aime un peu trop les boucles ! C'est vrais que ça ne doit pas être simple à comprendre...

    Du coup si tu as raison, ce que je trouve bizarre c'est que ma déclaration ne prend pas le datagridview après c'est modification...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim pdfTable As New PdfPTable(Form4_Ticket.Dtgdv_ticket.ColumnCount)
    Puisque c'est avant de cliquer sur le bouton, que je remplis et range mon datagridview !

    Qu'en pensez-vous?

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Par défaut
    Ce n'est pas si clair,

    "PdfPTable" n'est pas un type définit je ne sais pas d'où il vient, mais ça ressemble à une déclaration de tableau avec le même nombre de colonnes que le datagrid "Dtgdv_ticket"

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 697
    Par défaut
    Bonjour,
    en effet, il semble que par défaut, la librairie ITextSharp reprenne les paramètres de la source du Dgv.
    Il faut donc lui dire ce que l'on veut.
    Dans ce sens, je vous donne un exemple, dans lequel :
    - je récupère les données du Dgv dans un table en mémoire (DataTable).
    - j'ordonne mes colonnes comme je veux.
    - Je formate mes données en "langage" ITextSharp.
    - Je définis mes largeurs de colonnes.

    On peut, aussi, définir les polices, les encadrements de cellules, leur fond etc...
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
                'Récupération des données du Dgv dans une table.
                Dim dt As DataTable = New DataTable
     
                For Each col As DataGridViewColumn In DGV.Columns
                    dt.Columns.Add(col.HeaderText)
                Next
     
                For Each row As DataGridViewRow In DGV.Rows
                    If Not row.IsNewRow Then
                        Dim dRow As DataRow = dt.NewRow
                        For Each cell As DataGridViewCell In row.Cells
                            dRow(cell.ColumnIndex) = cell.Value
                        Next
                        dt.Rows.Add(dRow)
                    End If
                Next
     
                'Agencement des colonnes pour le visuel voulu.
                dt.Columns(5).SetOrdinal(0)
     
                'Récupération des données organisées pour le PDF.
                Dim pdfTable As New PdfPTable(dt.Columns.Count)
                pdfTable.DefaultCell.Padding = 3
                pdfTable.HorizontalAlignment = Element.ALIGN_CENTER
                pdfTable.DefaultCell.NoWrap = True
     
                'Formatage des données.
                For Each column As DataColumn In dt.Columns
                    Dim cell As New PdfPCell(New Phrase(column.Caption))
                    cell.BackgroundColor = New iTextSharp.text.BaseColor(240, 240, 240)
                    pdfTable.AddCell(cell)
                Next
     
                For Each row As DataRow In dt.Rows
                    For i As Integer = 0 To dt.Columns.Count - 1
                        Dim cell As String = row(i).ToString
                        Dim cellPDF As New PdfPCell
     
                        Select Case i
                            Case 0
                                Dim dat As DateTime
                                If Date.TryParse(cell, dat) Then
                                    cell = dat.ToShortDateString
                                End If
                                cellPDF.Phrase = New Phrase(cell)
                                cellPDF.Column.Alignment = Element.ALIGN_RIGHT
                                cellPDF.PaddingRight = 10
     
                            Case 4, 5
                                Dim dbl As Double
                                If Double.TryParse(cell, dbl) Then
                                    cell = dbl.ToString("0.00")
                                End If
                                cellPDF.Phrase = New Phrase(cell)
                                cellPDF.Column.Alignment = Element.ALIGN_RIGHT
                                cellPDF.PaddingRight = 10
                            Case Else
                                cellPDF.Phrase = New Phrase(cell)
                        End Select
     
                        pdfTable.AddCell(cellPDF)
                    Next
                Next
     
                '***********CHOIX L'UN OU L'AUTRE (ci dessous : l'autre effaçant l'un)
                'Définir largeurs colonnes, selon celles du DGV.
                Dim widths(DGV.Columns.Count - 1) As Integer
                For Each col As DataGridViewColumn In DGV.Columns
                    widths(col.Index) = col.Width
                Next
                pdfTable.SetWidths(widths)
                'ou en dur. Répartition affinée des largeurs de colonnes pour coller à la présentation du PDF que l'on veut (dim feuille, police etc...).
                '   la répartition se fait par proportionnalité, ici en %.
                pdfTable.SetWidths(New Integer() {20, 6, 28, 6, 20, 20})

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 34
    Par défaut
    Déjà j'aimerais vous remerciez tout deux pour vos réponses !
    Un grand merci a Chrismonoye, que je vois dans beaucoup de sujet aider des débutants comme moi (:

    Ton code est parfait, très maniable, est donne beaucoup de possibilité ! J'ai donc compris quelques points est voilà le code final pour la copie de mon datagridview dans mon PDF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
        Private Sub Bt_calcul_Click(sender As System.Object, e As System.EventArgs) Handles Bt_calcul.Click
     
            If Form4_Ticket.Dtgdv_ticket.ColumnCount = 0 Then
                MsgBox("Veuillez choisir une entité et lancer une recherche svp")
                Exit Sub
            End If
     
            'Récupération des données du Dgv dans une table.
            Dim dt As DataTable = New DataTable
     
            For Each col As DataGridViewColumn In Form4_Ticket.Dtgdv_ticket.Columns
                dt.Columns.Add(col.HeaderText)
            Next
     
            For Each row As DataGridViewRow In Form4_Ticket.Dtgdv_ticket.Rows
                Dim dRow As DataRow = dt.NewRow
                For Each cell As DataGridViewCell In row.Cells
                    dRow(cell.ColumnIndex) = cell.Value
                Next
                dt.Rows.Add(dRow)
            Next
     
            'Agencement des colonnes pour le visuel voulu.
            dt.Columns(8).SetOrdinal(1)
     
     
            'Récupération des données organisées pour le PDF.
            Dim pdfTable As New PdfPTable(dt.Columns.Count)
            pdfTable.DefaultCell.Padding = 3
            pdfTable.HorizontalAlignment = Element.ALIGN_CENTER
            pdfTable.DefaultCell.NoWrap = True
     
            'Formatage des données.
            For Each column As DataColumn In dt.Columns
                Dim cell As New PdfPCell(New Phrase(column.Caption))
                cell.BackgroundColor = New iTextSharp.text.BaseColor(196, 228, 229)
                pdfTable.AddCell(cell)
            Next
     
     
            Dim j As Integer = 0
            For Each row As DataRow In dt.Rows
                Dim cellPDF As New PdfPCell
                If Form4_Ticket.Dtgdv_ticket.Rows(j).DefaultCellStyle.BackColor = Color.LightGray Then
                    cellPDF.BackgroundColor = New iTextSharp.text.BaseColor(234, 246, 208)
                End If
     
                If Form4_Ticket.Dtgdv_ticket.Rows(j).DefaultCellStyle.BackColor = Color.LightCyan Then
                    cellPDF.BackgroundColor = New iTextSharp.text.BaseColor(255, 251, 207)
                End If
                j = j + 1
     
            For i As Integer = 0 To dt.Columns.Count - 1
                Dim cell As String = row(i).ToString
     
                Select Case i
                    Case 5
                        Dim dat As Date
                        If Date.TryParse(cell, dat) Then
                            cell = dat.ToShortDateString
                        End If
                        cellPDF.Phrase = New Phrase(cell)
                        cellPDF.Column.Alignment = Element.ALIGN_RIGHT
                        cellPDF.PaddingRight = 10
     
                    Case 4, 8
                        Dim dbl As Double
                        If Double.TryParse(cell, dbl) Then
                            cell = dbl.ToString("0")
                        End If
                        cellPDF.Phrase = New Phrase(cell)
                        cellPDF.Column.Alignment = Element.ALIGN_RIGHT
                        cellPDF.PaddingRight = 10
                    Case Else
                        cellPDF.Phrase = New Phrase(cell)
                End Select
     
                pdfTable.AddCell(cellPDF)
            Next
            Next
     
            pdfTable.SetWidths(New Integer() {7, 6, 7, 25, 6, 8, 6, 25, 6})
     
            Dim folderPath As String = "C:\Users\degecom\Desktop\PDF TEST"
            If Not Directory.Exists(folderPath) Then
                Directory.CreateDirectory(folderPath)
            End If
            Using stream As New FileStream(folderPath & "\test.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
     
            AxAcroPDF1.src = "C:\Users\degecom\Desktop\PDF TEST\test.pdf"
     
        End Sub
    Merci à vous, j'èspère que ce poste en aidera d'autre (:

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/07/2014, 18h30
  2. Transférer mon tableau HTML dans un pdf
    Par paladice dans le forum Débuter
    Réponses: 1
    Dernier message: 09/08/2013, 08h51
  3. Exporter les données Datagridview dans fichier pdf
    Par raulily dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 12/07/2013, 18h30
  4. transferer un datagridview dans pdf creator
    Par toutouz dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 08/06/2011, 14h19
  5. nombre de page dans un PDF ???
    Par rodolphedj dans le forum ASP
    Réponses: 15
    Dernier message: 08/09/2004, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo