Разделить результат вывода на n и цикл - PullRequest
0 голосов
/ 14 мая 2018

Я решаю проблему, когда мне нужно создать одну PDF-форму.

Эта PDF-форма состоит из 8 разделов, в которые мне нужно поместить информацию, и выглядит так, как показано на рисунке (показано только 4).

Дело в том, что мой запрос вернет 0 - n разных результатов.Поэтому мне нужно разделить на 8 и разместить на разных страницах.

Я попытался, как показано ниже, но это, похоже, не работает, так как я всегда загружаю новый документ.У кого-нибудь есть совет, как это сделать?

enter image description here

Try
    Dim sCommand As OleDb.OleDbCommand
    sCommand = New OleDb.OleDbCommand("SELECT a,b,c Query to fetch n results ", _dbCon)
    sCommand.CommandTimeout = 0
    Dim _dbREADER As OleDb.OleDbDataReader
    _dbREADER = sCommand.ExecuteReader
    Dim dt As DataTable = New DataTable()
    dt.Load(_dbREADER)

    Dim totalPages As Integer = dt.Rows.Count / 8
    Dim currentPage As Integer = 1
    Dim rowCounter As Long = 0

    If dt.Rows.Count > 0 Then
        For Each row In dt.Rows
            rowCounter += 1

            If rowCounter = 8 Then
                currentPage += 1
                rowCounter = 0
            End If

            _pdfDocumentOutput = System.IO.Path.GetTempPath() & "MailingForm_" & currentPage & ".pdf"
            SaveFromResources(_pdfDocument, My.Resources.template)

            Using reader As New PdfReader(_pdfDocument)
                Using stamper As New PdfStamper(reader, New IO.FileStream(_pdfDocumentOutput, IO.FileMode.Create))
                    Dim fontName As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "SCRIPTIN.ttf")
                    Dim bf As BaseFont = BaseFont.CreateFont(fontName, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)

                    Dim pdfForm As AcroFields = stamper.AcroFields
                    pdfForm.AddSubstitutionFont(bf)
                    pdfForm.SetField(rowCounter - 1 & "0", row("Customer")) 'Checks the top radiobutton of the VrPr4 field
                    pdfForm.SetField(rowCounter - 1 & "1", row("Address"))
                    pdfForm.SetField(rowCounter - 1 & "2", row("Location"))
                    stamper.FormFlattening = True
                End Using
            End Using
        Next
    End If

    Status.Text = "Store info loaded ! "
Catch ex As Exception
    Status.Text = ex.Message
End Try

1 Ответ

0 голосов
/ 15 мая 2018

Я нашел решение, разделив таблицы

 Private Shared Function SplitTable(ByVal originalTable As DataTable, ByVal batchSize As Integer) As List(Of DataTable)
        Dim tables As List(Of DataTable) = New List(Of DataTable)()
        Dim i As Integer = 0
        Dim j As Integer = 1
        Dim newDt As DataTable = originalTable.Clone()
        newDt.TableName = "Table_" & j
        newDt.Clear()
        For Each row As DataRow In originalTable.Rows
            Dim newRow As DataRow = newDt.NewRow()
            newRow.ItemArray = row.ItemArray
            newDt.Rows.Add(newRow)
            i += 1
            If i = batchSize Then
                tables.Add(newDt)
                j += 1
                newDt = originalTable.Clone()
                newDt.TableName = "Table_" & j
                newDt.Clear()
                i = 0
            End If

            If row.Equals(originalTable.Rows(originalTable.Rows.Count - 1)) Then
                tables.Add(newDt)
                j += 1
                newDt = originalTable.Clone()
                newDt.TableName = "Table_" & j
                newDt.Clear()
                i = 0
            End If
        Next

        Return tables
    End Function

И после этого цикл по каждой из таблиц. И положить все результаты в один файл

Dim tables = SplitTable(dt, 8)
...