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