windows

csvファイルの帳票印刷 VB.NET

csvファイルの帳票印刷 VB.NET

環境 Windows11 23H2 & Visual Studio 2022 ファイルは、C:\Temp_File\取引先マスター.csv を使用。

メイン画面

処理選択メニューバー

Printerコンボ選択

PaperSizeコンボ選択

用紙方向コンボ選択

印刷プレビュー

ソリューション

Form1.vb

Imports System.Drawing.Drawing2D
Imports System.Drawing.Printing
Imports System.IO
Imports System.Text
Imports System.Windows.Forms.VisualStyles.VisualStyleElement

Public Class Form1

    ' 印刷の定義
    Private doc As PrintDocument = Nothing

    '最大行数( 1ページに印刷する行数 )
    Private rowMax As Integer

    'ページ数
    Private pageCount As Integer = 0

    '行数(印字する行位置)
    Private prtRow As Integer = 1

    ' 印字用フォント
    Private prtFon12 As Font = New Font("MS 明朝", 12, FontStyle.Regular)
    Private prtFon14 As Font = New Font("MS 明朝", 14, FontStyle.Regular)

    ' 印字用テキスト
    Private prtText As System.Drawing.Graphics

    ' マージン
    Private TopMargin As Integer
    Private LeftMargin As Integer

    ' 外部データ
    Private ReadFile As StreamReader
    Private LineText As String

    '-------------------------------------------------------
    ' フォーム初期処理
    '-------------------------------------------------------
    Private Sub Form1_Load(ByVal sender As System.Object,
     ByVal e As System.EventArgs) Handles MyBase.Load

        '印刷処理実体の作成
        doc = New PrintDocument()

        'プリンター名セット
        TextBox1.Text = doc.PrinterSettings.PrinterName.ToString
        ComboBox1.Items.Clear()

        Dim PrinterName As String
        For Each PrinterName _
            In Printing.PrinterSettings.InstalledPrinters
            ComboBox1.Items.Add(PrinterName)
        Next

        '用紙サイズセット
        TextBox2.Text = "A4"
        ComboBox2.Items.Clear()

        Dim PaperSize As System.Drawing.Printing.PaperSize
        For Each PaperSize _
            In doc.PrinterSettings.PaperSizes
            ComboBox2.Items.Add(PaperSize.PaperName)
        Next

        '用紙方向セット
        TextBox3.Text = "縦"
        ComboBox3.Items.Clear()
        ComboBox3.Items.Add("縦")
        ComboBox3.Items.Add("横")

    End Sub

    '-------------------------------------------------------
    ' 印刷ボタン処理
    '-------------------------------------------------------
    Private Sub Button1_Click(ByVal sender As System.Object,
     ByVal e As System.EventArgs) Handles Button1.Click

        '印刷開始
        '印刷処理実体の作成
        doc = New PrintDocument()
        ' プレビューのプロパティにセット
        PrintPreviewDialog1.Document = doc

        'プリンター指定
        doc.PrinterSettings.PrinterName = TextBox1.Text().ToString

        ' 用紙の向きを設定(横:True、縦:False)
        doc.DefaultPageSettings.Landscape = False
        If TextBox3.Text = "横" Then
            doc.DefaultPageSettings.Landscape = True
        End If

        '用紙サイズ指定
        Dim paperSize As PaperSize

        With doc.PrinterSettings
            For Each paperSize In .PaperSizes
                Debug.WriteLine(paperSize)
                If paperSize.PaperName = TextBox2.Text().ToString Then
                    doc.DefaultPageSettings.PaperSize = paperSize
                    Exit For
                End If
            Next
        End With

        '印刷イベントをプレビューから呼び出せるように登録する
        AddHandler doc.PrintPage, AddressOf doc_PrintPage
        PrintPreviewDialog1.ShowDialog()

    End Sub

    '-------------------------------------------------------
    ' 終了ボタン処理
    '-------------------------------------------------------
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Me.Close()

    End Sub

    '-------------------------------------------------------
    'プリンター名コンボ処理
    '-------------------------------------------------------
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        TextBox1.Text = ComboBox1.Text

    End Sub

    '-------------------------------------------------------
    '用紙サイズコンボ処理
    '-------------------------------------------------------
    Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged

        TextBox2.Text = ComboBox2.Text

    End Sub

    '-------------------------------------------------------
    '用紙方向コンボ処理
    '-------------------------------------------------------
    Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged

        TextBox3.Text = ComboBox3.Text

    End Sub

    '-------------------------------------------------------
    ' プレビューダイアログの初期処理
    '-------------------------------------------------------
    Private Sub PrintPreviewDialog1_Load(ByVal sender As System.Object,
     ByVal e As System.EventArgs) Handles PrintPreviewDialog1.Load

        'デスクトップ左上
        PrintPreviewDialog1.DesktopLocation = New System.Drawing.Point(0, 0)

        'ダイアログの大きさ
        PrintPreviewDialog1.Width = 800
        PrintPreviewDialog1.Height = 600

        '倍率
        PrintPreviewDialog1.PrintPreviewControl.Zoom = 1

    End Sub

    '-------------------------------------------------------
    ' 印刷処理
    '-------------------------------------------------------
    Private Sub doc_PrintPage(ByVal sender As System.Object,
    ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        '左側余白
        LeftMargin = e.MarginBounds.Left
        '上側余白
        TopMargin = e.MarginBounds.Top

        '現在のコンテキストを取得
        prtText = e.Graphics

        '印刷に必要なデータを取得します
        GetPrtData(e)

        '1ページの行数セット
        rowMax = 55
        If TextBox2.Text = "A4" And TextBox3.Text = "横" Then
            rowMax = 39
        End If

        '-------------------------------------------------------
        '初回処理(ページ = 0 )
        '-------------------------------------------------------
        If pageCount = 0 Then
            Try
                'SHIFT_JIS 
                ReadFile =
                 New StreamReader("C:\Temp_File\取引先マスター.csv",
                 Encoding.GetEncoding(932))

            Catch 'e As Exception
                ' ※ エラーの場合、空ページを出力してしまうので、
                ' ※ 呼び出す以前にチェックする必要がある
                MessageBox.Show("入力ファイルエラーです")
                ' データ終了
                e.HasMorePages = False
                Return
            End Try

        End If
        pageCount += 1
        prtRow = 4

        '-------------------------------------------------------
        '印字処理
        '-------------------------------------------------------
        Do
            'データがなくなった場合
            'データがない場合は、空ページを印字してしまうので
            '呼び出す前にチェックする
            If ReadFile.EndOfStream Then
                ReadFile.Close()
                ReadFile.Dispose()

                '見出し印字
                headerForm(e)

                pageCount = 0
                prtRow = 5

                'データ終了なので完全脱出
                e.HasMorePages = False
                Return
            End If

            'データが印字できない場合は
            'データを読み込まないようにする
            If prtRow > rowMax Then

                '見出し印字
                headerForm(e)

                prtRow = 4

                'ページ内にデータ印字できないので出る
                Exit Do
            End If

            '次行読み込み
            LineText = ReadFile.ReadLine()

            'csv形式なので分割
            Dim field As String()
            field = Split(LineText, ",", -1, CompareMethod.Binary)

            'データ印字
            PrtString(prtRow, 50, Replace(field(0), """", ""), prtFon12)
            PrtString(prtRow, 120, Replace(field(1), """", ""), prtFon12)
            PrtString(prtRow, 450, Replace(field(2), """", ""), prtFon12)

            '行数へ1を加算
            prtRow += 1

        Loop

        '次ページがあり
        e.HasMorePages = True


    End Sub

    '-------------------------------------------------------
    ' 印字に必要なデータの取得
    '-------------------------------------------------------
    Private Sub GetPrtData(ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        ' 左側余白
        LeftMargin = 20
        ' 上側余白
        TopMargin = 20
        ' 現在のコンテキストを取得
        prtText = e.Graphics

    End Sub

    '-------------------------------------------------------
    ' 文字列を指定行の先頭から印字
    '-------------------------------------------------------
    Private Sub PrtString(ByVal row As Integer,
        ByVal xPos As Integer,
        ByVal str As String,
        Optional ByVal TargetFont As Font = Nothing)

        If TargetFont Is Nothing Then
            TargetFont = prtFon12
        End If

        Dim yPos As Integer = 0
        '1行を20と設定
        yPos = TopMargin + (row - 1) * 20

        '印字可能な左端から文字列をセットする
        prtText.DrawString(str, TargetFont, Brushes.Black, LeftMargin + xPos, yPos)

    End Sub

    '青印字
    Private Sub PrtString_blue(ByVal row As Integer,
        ByVal xPos As Integer,
        ByVal str As String,
        Optional ByVal TargetFont As Font = Nothing)

        If TargetFont Is Nothing Then
            TargetFont = prtFon12
        End If

        Dim yPos As Integer = 0
        '1行を20と設定
        yPos = TopMargin + (row - 1) * 20 '1行を20と設定
        ' 印字可能な左端から文字列をセットする
        prtText.DrawString(str, TargetFont, Brushes.Blue, LeftMargin + xPos, yPos)

    End Sub

    '--------------------------------------------------------
    ' 見出しデータ印字
    '--------------------------------------------------------
    Private Sub headerForm(ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        PrtString_blue(1, 200, "** 取引先マスター一覧表 **", prtFon14)

        Dim StrPage As String = "   " + pageCount.ToString("#,0")
        StrPage = StrPage.Substring(StrPage.Length - 3)
        PrtString(1, 680, "page : " + StrPage, prtFon12)

        PrtString_blue(3, 0, "取引先コード", prtFon12)
        PrtString_blue(3, 120, "取引先名", prtFon12)
        PrtString_blue(3, 400, "取引先区分", prtFon12)

        ' 横線設定
        'Penオブジェクトの作成(幅0.1の黒色)
        Dim blackPen As New Pen(Color.Black, 0.1)
        'ダッシュ
        blackPen.DashStyle = DashStyle.Solid

        '明細行へ横線印字
        Dim i As Integer
        For i = 1 To rowMax - 1
            prtText.DrawLine(blackPen, 20, 39 + i * 20, 800, 39 + i * 20)
        Next

        '縦線印字
        prtText.DrawLine(blackPen, 20, 59, 20, (rowMax + 1) * 20)
        prtText.DrawLine(blackPen, 130, 59, 130, (rowMax + 1) * 20)
        prtText.DrawLine(blackPen, 400, 59, 400, (rowMax + 1) * 20)
        prtText.DrawLine(blackPen, 800, 59, 800, (rowMax + 1) * 20)

        '次に印字する行
        prtRow = 4

    End Sub

    '-------------------------------------------------------
    ' 印刷メニュー処理
    '-------------------------------------------------------
    Private Sub 印刷ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 印刷ToolStripMenuItem.Click

        '開始
        '印刷処理の実体の作成
        doc = New PrintDocument()
        ' プレビューのプロパティにセット
        PrintPreviewDialog1.Document = doc

        'プリンター指定
        doc.PrinterSettings.PrinterName = TextBox1.Text().ToString

        '用紙の向きを設定(横:True、縦:False)
        doc.DefaultPageSettings.Landscape = False
        If TextBox3.Text = "横" Then
            doc.DefaultPageSettings.Landscape = True
        End If

        '用紙サイズ指定
        Dim paperSize As PaperSize

        With doc.PrinterSettings
            For Each paperSize In .PaperSizes
                Debug.WriteLine(paperSize)
                If paperSize.PaperName = TextBox2.Text().ToString Then
                    doc.DefaultPageSettings.PaperSize = paperSize
                    Exit For
                End If
            Next
        End With

        '印刷イベントをプレビューから呼び出せるように登録する
        AddHandler doc.PrintPage, AddressOf doc_PrintPage
        PrintPreviewDialog1.ShowDialog()

    End Sub

    '-------------------------------------------------------
    ' 終了メニュー処理
    '-------------------------------------------------------
    Private Sub 終了ToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles 終了ToolStripMenuItem1.Click

        Me.Close()

    End Sub

End Class

-windows

PAGE TOP