Распечатать документ как PDF? - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужно создать функцию для получения данных из базы данных и печати в файле PDF.

Кто-нибудь знает, как мне помочь?

Я пробовал этот способ из предыдущего примера, но у меня есть некоторые проблемы с процедурами, а также я не уверен, что это правильный путь.

Так что я бы использовал некоторую помощь и веб-сайт или учебные пособия для решения этой проблемы.

Private Sub buildEsamelaboratorio(ByVal operations As DataOperations, ByVal body As IBand, ByVal cc As CartellaClinica, ByVal idCC As String, ByVal idRicovero As String)

    Try
        Dim sql As New SQL(operations.getDBMS)

        Dim Esamelaboratorio As New DataTable

        If operations.CHECK_IFEXIST_IDCC_ESAME_L(idCC) Or operations.CHECK_IFEXIST_IDCC_ESAME_LLN_ULN(idCC) Then
            Esamelaboratorio = operations.GET_CC_TEST_LABORATORY(idCC)

        End If

        Dim tableEsameLaboratorio As New DataTable
        tableEsameLaboratorio.Columns.Add(New DataColumn)
        Dim anamnesiEoUtils As New AnamnesiEoInit

        Dim disciplineDegenza = anamnesiEoUtils.getDisciplineDegenza(idRicovero, operations, cc)
        Dim campiEsameLaboratorio = anamnesiEoUtils.getEsameLaboratorio(disciplineDegenza, operations, True)   'just to test cause the procedure is the wrong one
        If Esamelaboratorio IsNot Nothing Then
            For Each DESCRIPTION As String In campiEsameLaboratorio
                Dim dictionaryRecords As List(Of CN_TEST_LABORATORY_MODEL_ITEMS) = operations.GET_EsameLaboratorio(DESCRIPTION)
                Dim table As DataTable
                table = New DataTable()
                Dim row As DataRow = table.NewRow()
                If Not table.Columns.Count = 0 Then
                    Dim hasDESCRIPTION As Boolean
                    hasDESCRIPTION = True
                    row(0) = hasDESCRIPTION


                    If dictionaryRecords.Count > table.Columns.Count - 1 Then

                        Dim numberOfNewColumns = dictionaryRecords.Count - (table.Columns.Count - 1) 'Excluding label column

                        For index As Integer = 1 To numberOfNewColumns

                            table.Columns.Add(New DataColumn)
                        Next
                    End If
                    Dim rowHasValues As Boolean = False
                    For index As Integer = 0 To dictionaryRecords.Count - 1

                        Dim value As String

                        If EsamelaboratorioTypes.Esamelaboratorio Then

                            '               value = getEsamelaboratorioEoCellValue(Esamelaboratorio, dictionaryRecords(index), sql)

                        Else
                            value = ""
                        End If
                        If value <> "" AndAlso value <> "NO" AndAlso value <> "-" Then

                            If hasDESCRIPTION Then

                                row(index + 1) = value

                            Else

                                row(index) = value
                            End If

                            rowHasValues = True
                        End If
                    Next
                    If rowHasValues Then
                        table.Rows.Add(row)
                    End If
                End If
            Next
        End If

    Catch ex As Exception
        Dim log As New Log
        log.writeLog("cartellaClinicaReport", ex, "idCC: " + idCC)
    End Try
End Sub

1 Ответ

0 голосов
/ 14 сентября 2018

Может быть, это может помочь вам:

Сначала мы должны получить данные из БД, вышеупомянутая функция сделает это при сохранении результатов в DataTable

Private Function GetDataFromDB() As DataTable
    Dim your_connection_string As String = "INSERT_YOUR_CONNECTION_STRING_HERE!"
    Dim your_query As String = "INSERT_YOUR_QUERY_HERE!"
    Dim dt As New DataTable
    Using myConn As New OracleClient.OracleConnection(your_connection_string)
        myConn.Open()
        Using myCmd As New OracleClient.OracleDataAdapter(your_query, myConn)
            myCmd.Fill(dt) 'Fill the DataTable with the query results
        End Using
        myConn.Close()
    End Using
    Return dt
End Function

Как вы можете видеть вышеупомянутая функция возвращает значение DataTable, поэтому мы будем вызывать его внутри следующей функции!

Приведенная ниже функция напечатает в файле PDF данные внутри DataGridView. Итак, мы собираемся связать DataTable как DataGridView.DataSource

Private Sub CreatePdf(ByVal dt As DataTable)
    Dim DataGridView1 As New DataGridView
    DataGridView1.DataSource = dt
    'Creating iTextSharp Table from the DataTable data
    Dim pdfTable As New PdfPTable(DataGridView1.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 DataGridView1.Columns
        Dim cell As New PdfPCell(New Phrase(column.HeaderText))
        'cell.BackgroundColor = New iTextSharp.text.BaseColor(240, 240, 240)
        pdfTable.AddCell(cell)
    Next

    'Adding Data
    For Each row As DataGridViewRow In DataGridView1.Rows
        For Each cell As DataGridViewCell In row.Cells
            pdfTable.AddCell(cell.Value.ToString())
        Next
    Next

    'Exporting to PDF
    Dim folderPath As String = "YOUR_SAVING_PATH_HERE"
    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

Как вы можете видеть, CreatePdf имеет параметр DataTable, поэтому давайте назовем его при возникновении события button click, например:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    CreatePdf(GetDataFromDB())
End Sub

Как вы можете видеть, мы вызываем функцию внутри функции. Это связано с тем, что CreatePdf() имеет параметр DataTable, а GetDataFromDB возвращает значение DataTable!

нотабене

Для того, чтобы это работало, вам нужно включить следующее imports:

Imports System.Data.SqlClient
Imports System
Imports iTextSharp.text
Imports iTextSharp.text.api
Imports iTextSharp.text.pdf
Imports iTextSharp.text.pdf.parser
Imports System.Text
Imports System.IO

Вы также должны добавить ссылку в itextsharp.dll и System.Data.OracleClient

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...