Skip to main content

PrintDocument dalam Bentuk Tabel Multiline

VB.NET : PrintDocument dalam Bentuk Tabel Multiline

Setelah contoh simple yang Rani kasih di artikel sebelumnya:

Data yang dicetak dalam contoh artikel tersebut cukup pendek dan simple. Kita coba ubah dengan memperpanjang beberapa text dalam cell.

Sub Data_Load()
    dt = New DataTable
    With dt.Columns
        .Add("code"Type.GetType("System.String"))
        .Add("name"Type.GetType("System.String"))
        .Add("address"Type.GetType("System.String"))
    End With

    Dim ItemRow As DataRow

    ItemRow = dt.NewRow()
    ItemRow("code") = "A001"
    ItemRow("name") = "Dwi Nuraeni Permata Andikasari"
    ItemRow("address") = "Jl. Linggawastu No.15, Tamansari, " & _
                         "Kec. Bandung Wetan, Kota Bandung, Jawa Barat 40116"
    dt.Rows.Add(ItemRow)

    temRow = dt.NewRow()
    ItemRow("code") = "A002"
    ItemRow("name") = "Kania Desiani Tri Hapsari Ardiana"
    ItemRow("address") = "Jakarta"
    dt.Rows.Add(ItemRow)

    ItemRow = dt.NewRow()
    ItemRow("code") = "A002"
    ItemRow("name") = "Naufal Hartanto"
    ItemRow("address") = "Medan"
    dt.Rows.Add(ItemRow)

End Sub

Tanpa mengubah code lainnya, hasilnya cukup berantakan.

Lalu bagaimana supaya rapi? Kita masih tetep menggunakan function yang sama tapi ada sedikit tambahan trik pada event PrintDocument1_PrintPage.

Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) _
    Handles PrintDocument1.PrintPage

    'titik awal diambil dari margin top 
     Dim CurY As Integer = yZero

    'print judul hanya di halaman pertama
     If iPage = 0 Then
        CurY = pf.PrintCellText("Member Data", CurY, xZero, PWArea, e, pf.FntTitle, pf.MidCenter)
    End If

    'memberi jarak judul dan tabel
    CurY = CurY + 10

    'code untuk handle jika lebih dari satu halaman
    If iPage > 0 Then CurY = yZero

    'menyimpan teks header dalam array
    Dim ColHeader() As String = {"Member Code""Member Name""Address"}

    'menyimpan lebar kolom dalam array
    'lebar diambil dari proporsi lebar area printing
    Dim ColWidth() As Integer = {CInt(PWArea * 0.3), CInt(PWArea * 0.3), CInt(PWArea * 0.4)}

    'posisi x awal tiap kolom
    Dim ColX(ColWidth.Length - 1) As Integer

    'lebar yang telah digunakan dalam putaran
    'untuk menghitung posisi awal kolom
    Dim totColWidth As Integer = xZero

    'variable untuk menampung nilai tinggi karakter yang di-print 
    Dim iResult As Integer

    For As Integer = 0 To ColWidth.Length - 1
        'menghitung posisi x awal tiap kolom
        ColX(i) = totColWidth : totColWidth = totColWidth + ColWidth(i)
        'print table header
        iResult = pf.PrintCellText(ColHeader(i), ColX(i), CurY, ColWidth(i), e, _
                                   pf.FntTableHeader, pf.MidCenter, False)
    Next

    'membuat kotak mengelilingi cell
    For As Integer = 0 To ColWidth.Length - 1
        e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iResult - CurY)
    Next

    'ambil posisi y dari tinggi char yang terakhir di-print
    CurY = iResult

    Dim iMore As Integer = 0

    Do While r <= dt.Rows.Count - 1
        'print nilai masing-masing cell
        iResult = pf.PrintCellText(dt.Rows(r)("code"), ColX(0), CurY, ColWidth(0), e, _
                                   pf.FntTableCell, pf.MidLeft, False)
        If iResult > iMore Then iMore = iResult

        iResult = pf.PrintCellText(dt.Rows(r)("name"), ColX(1), CurY, ColWidth(1), e, _
                                   pf.FntTableCell, pf.MidLeft, False)
        If iResult > iMore Then iMore = iResult

        iResult = pf.PrintCellText(dt.Rows(r)("address"), ColX(2), CurY, ColWidth(2), e, _
                                   pf.FntTableCell, pf.MidLeft, False)
        If iResult > iMore Then iMore = iResult
        
       
        'membuat kotak mengelilingi cell
        For As Integer = 0 To ColWidth.Length - 1
            e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iMore - CurY)
        Next

        'ambil posisi y dari tinggi char yang terakhir di-print 
        CurY = iMore

        'jika sudah 90% hari tinggi print area, halaman baru
        If CurY >= 0.9 * PHArea Then
            e.HasMorePages = True
            iPage += 1
            r += 1
            Return
        End If

        r += 1
    Loop

    If r = dt.Rows.Count Then e.HasMorePages = False

End Sub

Untuk kode lainnya masih sama, jadi berikut kode lengkapnya:
Imports System.Drawing.Printing

Public Class Form1

    Dim dt As DataTable

    'deklarasi class printing
    Dim pf As PrintingFormat = New PrintingFormat

    'Deklarasi untuk mengambil setting default
    Dim PS As System.Drawing.Printing.PageSettings
    Dim PWArea As Integer
    Dim PHArea As Integer
    Dim xZero As Integer
    Dim yZero As Integer
    Dim iPage As Integer
    Dim r As Integer 'menampung urutan row

    Sub Data_Load()
        dt = New DataTable
        With dt.Columns
            .Add("code", Type.GetType("System.String"))
            .Add("name", Type.GetType("System.String"))
            .Add("address", Type.GetType("System.String"))
        End With

        Dim ItemRow As DataRow

        ItemRow = dt.NewRow()
        ItemRow("code") = "A001"
        ItemRow("name") = "Dwi Nuraeni Permata Andikasari"
        ItemRow("address") = "Jl. Linggawastu No.15, Tamansari, Kec. Bandung Wetan, Kota Bandung, Jawa Barat 40116"
        dt.Rows.Add(ItemRow)

        ItemRow = dt.NewRow()
        ItemRow("code") = "A002"
        ItemRow("name") = "Kania Desiani Tri Hapsari Ardiana"
        ItemRow("address") = "Jakarta"
        dt.Rows.Add(ItemRow)

        ItemRow = dt.NewRow()
        ItemRow("code") = "A002"
        ItemRow("name") = "Naufal Hartanto"
        ItemRow("address") = "Medan"
        dt.Rows.Add(ItemRow)

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Data_Load()

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) _
        Handles Button1.Click

        PrintDocument1.Print()

    End Sub

    Private Sub PrintDocument1_BeginPrint(sender As Object, e As PrintEventArgs) Handles PrintDocument1.BeginPrint
        PS = PrintDocument1.DefaultPageSettings 'get default setting 
        PWArea = PS.PaperSize.Width - (PS.Margins.Left + PS.Margins.Right)
        PHArea = PS.PaperSize.Height - (PS.Margins.Left + PS.Margins.Right)
        xZero = PS.Margins.Left
        yZero = PS.Margins.Top
        iPage = 0 'indicate page number
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) _
        Handles PrintDocument1.PrintPage

        'titik awal diambil dari margin top
        Dim CurY As Integer = yZero

        'print judul hanya di halaman pertama
        If iPage = 0 Then
            CurY = pf.PrintCellText("Member Data", CurY, xZero, PWArea, e, pf.FntTitle, pf.MidCenter)
        End If

        'memberi jarak judul dan tabel
        CurY = CurY + 10

        'code untuk handle jika lebih dari satu halaman
        If iPage > 0 Then CurY = yZero

        'menyimpan teks header dalam array
        Dim ColHeader() As String = {"Member Code", "Member Name", "Address"}

        'menyimpan lebar kolom dalam array
        'lebar diambil dari proporsi lebar area printing
        Dim ColWidth() As Integer = {CInt(PWArea * 0.3), CInt(PWArea * 0.3), CInt(PWArea * 0.4)}

        'posisi x awal tiap kolom
        Dim ColX(ColWidth.Length - 1) As Integer

        'lebar yang telah digunakan dalam putaran
        'untuk menghitung posisi awal kolom
        Dim totColWidth As Integer = xZero

        'variable untuk menampung nilai tinggi karakter yang di-print
        Dim iResult As Integer

        For i As Integer = 0 To ColWidth.Length - 1
            'menghitung posisi x awal tiap kolom
            ColX(i) = totColWidth : totColWidth = totColWidth + ColWidth(i)
            'print table header
            iResult = pf.PrintCellText(ColHeader(i), ColX(i), CurY, ColWidth(i), e,
                                       pf.FntTableHeader, pf.MidCenter, False)
        Next

        'membuat kotak mengelilingi cell
        For i As Integer = 0 To ColWidth.Length - 1
            e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iResult - CurY)
        Next

        'ambil posisi y dari tinggi char yang terakhir di-print
        CurY = iResult

        Dim iMore As Integer = 0

        Do While r <= dt.Rows.Count - 1
            'print nilai masing-masing cell
            iResult = pf.PrintCellText(dt.Rows(r)("code"), ColX(0), CurY, ColWidth(0), e,
                                       pf.FntTableCell, pf.MidLeft, False)
            If iResult > iMore Then iMore = iResult

            iResult = pf.PrintCellText(dt.Rows(r)("name"), ColX(1), CurY, ColWidth(1), e,
                                       pf.FntTableCell, pf.MidLeft, False)
            If iResult > iMore Then iMore = iResult

            iResult = pf.PrintCellText(dt.Rows(r)("address"), ColX(2), CurY, ColWidth(2), e,
                                       pf.FntTableCell, pf.MidLeft, False)
            If iResult > iMore Then iMore = iResult

            'membuat kotak mengelilingi cell
            For i As Integer = 0 To ColWidth.Length - 1
                e.Graphics.DrawRectangle(Pens.Black, ColX(i), CurY, ColWidth(i), iMore - CurY)
            Next

            'ambil posisi y dari tinggi char yang terakhir di-print 
            CurY = iMore

            'jika sudah 90% hari tinggi print area, halaman baru
            If CurY >= 0.9 * PHArea Then
                e.HasMorePages = True
                iPage += 1
                r += 1
                Return
            End If

            r += 1
        Loop

        If r = dt.Rows.Count Then e.HasMorePages = False

    End Sub

End Class
UI juga masih sama:


Dan saat kita coba run dan print hasilnya sebagai berikut:

 

Comments

Popular posts from this blog

Download Berbagai Font Notasi Angka Terbaik dan Cara Penulisan di MS Word

Font Notasi Angka Untuk membuat Partitur Lagu Not Angka

16+ Font dan Kode untuk Membuat Simbol Musik di Word