尝试将数据从datagridview插入PDFptable时,超出范围异常

时间:2013-12-24 15:05:23

标签: vb.net datagridview pdf-generation itextsharp

我有一个datagridview,我正在尝试以pdf格式导出。我下载并实现了一个datagridviewtopdf类,但我需要对其进行修改以动态创建必要的列(列数一年中的列数为1-12个月)。我还需要包含一个额外的列来为我的datagridview中的每一行添加行标题文本。我有代码,我将在下面包含。我一直在我主演的那一行获得OutOfRange异常。知道如何解决这个问题并创建pdf以类似我的datagridview表吗?

编辑还包括datagridview的屏幕截图。 Datagridview最多包含65行和最多12列(不包括行标题或列标题

Datagridview example 1 http://i43.tinypic.com/331q0yu.jpg Datagridview example 2, shows how the table dynamically changes between tabs http://i44.tinypic.com/jh4ykm.png

  Private Function GetDataTable() As System.Data.DataTable
    Dim dataTable As New Data.DataTable("MyDataTable")
    'Create another DataColumn Name
    For column As Integer = 1 To DataGridView1.ColumnCount - 1
        Dim dataColumn_1 As New DataColumn(DataGridView1.Columns(column).HeaderText.ToString(), GetType(String))
        dataTable.Columns.Add(dataColumn_1)
        'Now Add some row to newly created dataTable
        Dim dataRow As DataRow
        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            dataRow = dataTable.NewRow()
            ' Important you have create New row
            dataRow(DataGridView1.Columns(column).HeaderText.ToString()) = DataGridView1.Rows(i).Cells(column).Value.ToString()
            dataTable.Rows.Add(dataRow)
        Next i
    Next column
    dataTable.AcceptChanges()
    Return dataTable
End Function

Private Sub ExportDataToPDFTable()
    Dim paragraph As New Paragraph
    Dim doc As New Document(iTextSharp.text.PageSize.A4, 40, 40, 40, 10)
    Dim wri As PdfWriter = PdfWriter.GetInstance(doc, New FileStream(SaveFileDialog1.FileName + ".pdf", FileMode.Create))
    doc.Open()

    Dim font12BoldRed As New iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12.0F, iTextSharp.text.Font.UNDERLINE Or iTextSharp.text.Font.BOLDITALIC, BaseColor.RED)
    Dim font12Bold As New iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12.0F, iTextSharp.text.Font.BOLD, BaseColor.BLACK)
    Dim font12Normal As New iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12.0F, iTextSharp.text.Font.NORMAL, BaseColor.BLACK)

    Dim p1 As New Phrase
    p1 = New Phrase(New Chunk("PDF From Datagridview Data", font12BoldRed))
    doc.Add(p1)

    'Create instance of the pdf table and set the number of column in that table
    Dim PdfTable As New PdfPTable(DataGridView1.ColumnCount + 1)
    PdfTable.TotalWidth = 490.0F
    'fix the absolute width of the table
    PdfTable.LockedWidth = True
    'relative col widths in proportions - 1,4,1,1 and 1
    'Dim widths As Single() = New Single() {1.0F, 1.0F, 1.0F, 1.0F, 1.0F}
    ' PdfTable.SetWidths(widths)
    PdfTable.HorizontalAlignment = 1 ' 0 --> Left, 1 --> Center, 2 --> Right
    PdfTable.SpacingBefore = 2.0F

    'pdfCell Decleration
    Dim PdfPCell As PdfPCell = Nothing
    'Assigning values to each cell as phrases
    For column As Integer = 0 To (DataGridView1.ColumnCount - 1)
        If column = 0 Then
            For row As Integer = 0 To (DataGridView1.RowCount - 1)
                'Getting out of range exception below for row
                PdfPCell = New PdfPCell(New Phrase(New Chunk(DataGridView1.Rows(row).HeaderCell.ToString, font12Bold)))
                'Add pdfcell in pdftable
                PdfTable.AddCell(PdfPCell)
            Next row

        Else
            PdfPCell = New PdfPCell(New Phrase(New Chunk(DataGridView1.Columns(column).HeaderText, font12Bold)))
            'Alignment of phrase in the pdfcell
            PdfPCell.HorizontalAlignment = PdfPCell.ALIGN_CENTER

            'Add pdfcell in pdftable
            PdfTable.AddCell(PdfPCell)
        End If


    Next column


    Dim dt = GetDataTable()
    If dt IsNot Nothing Then
        'Now add the data from datatable to pdf table
        For rows As Integer = 0 To dt.Rows.Count - 1
            For column As Integer = 0 To dt.Columns.Count - 1
                PdfPCell = New PdfPCell(New Phrase(dt.Rows(rows)(column).ToString(), font12Normal))
                If column = 0 Or column = 1 Then
                    PdfPCell.HorizontalAlignment = PdfPCell.ALIGN_LEFT
                Else
                    PdfPCell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT
                End If
                PdfTable.AddCell(PdfPCell)
            Next
        Next
        'Adding pdftable to the pdfdocument
        doc.Add(PdfTable)
    End If
    doc.Close()
End Sub

1 个答案:

答案 0 :(得分:1)

变化:

For column As Integer = 1 To DataGridView1.ColumnCount + 1
For row As Integer = 1 To DataGridView1.RowCount

要:

For column As Integer = 0 To (DataGridView1.ColumnCount - 1)
For row As Integer = 0 To (DataGridView1.RowCount -1)

请记住:它是零基索引。

示例:

Dim dtColumn As DataColumn
Dim dtRow As DataRow

For column As Integer = 0 To (Me.DataGridView1.ColumnCount - 1)
    dtColumn = dt.Columns.Item(Me.DataGridView1.Columns(column).DataPropertyName)
    For row As Integer = 0 To (DataGridView1.RowCount - 1)
        dtRow = DirectCast(Me.DataGridView1.Rows(row).DataBoundItem, DataRowView).Row

        'Replace this:
        'PdfPCell = New PdfPCell(New Phrase(dt.Rows(rows)(column).ToString(), font12Normal))

        'With this:
        PdfPCell = New PdfPCell(New Phrase(row.Item(column).ToString(), font12Normal))

    Next
Next