Edited at

【VB.NET】フリーの帳票出力(Microsoft レポート)


前提条件

Visual Studio 2017


はじめに

.NETで帳票出力といえば昔はCrystalReportsだったが、いつからか無くなった。

それ以降、帳票出力したいなら商用ツールを購入するのが定石かと思っていたが、Microsoft公式の帳票出力ツールがあったらしい。それがMicrosoftレポート。


インストール

公式とはいえ、最初からVisual Studioに含まれてはいないので、インストールが必要。

インストール手順の動画(英語)

https://youtu.be/70uUsC5GFgk


  1. Visual Studioのメニュー → ツール → 拡張機能と更新プログラム を選ぶ。

    01.PNG

  2. 左側で「オンライン」を選び、検索エリアに「rdlc」と入力する。すると「Microsoft RDLC Report Designer」が出てくるので、ダウンロードボタンを押す。

    02.PNG

  3. 下部にVisual Studioを終了させるように促すメッセージが出るので、ウィンドウを閉じてVisual Studioを終了させる。

    03.PNG

  4. 終了させた後しばらく待っていると(待ち時間はPCスペックによるかも)、インストーラの画面が起動するので、「変更」を押す。

    04.PNG

  5. しばらく待っているとインストールが完了するので、インストーラを閉じて、Visual Studioを起動する。

    05.PNG


ReportViewerコントロールの追加

拡張機能をインストールしただけでは、WindowsフォームコントロールにReportViewerが追加されない。


  1. プロジェクトで右クリック→「NuGetパッケージの管理」を選ぶ。


  2. Microsoft.ReportingServices.ReportViewerControl.WebFormsまたはMicrosoft.ReportingServices.ReportViewerControl.WinFormsを探してインストール。



  3. インストールが完了すると、ツールボックスにReportViewerが追加されている。



ちなみに、ReportViewerコントロールは、SQLServer上に作ったレポートファイルも表示できる。

※ ツールボックスにReportViewerが無い場合


  1. ツールボックスで右クリック→「アイテムの選択」を選ぶ。(もしくは、メニュー→「ツール」→「ツールボックスアイテムの選択」)

  2. 「参照」を押す。




  3. ソリューションフォルダ\packages\Microsoft.ReportingServices.ReportViewerControl.Winforms.150.900.148\lib\net40にあるMicrosoft.ReportViewer.WebForms.dllまたはMicrosoft.ReportViewer.WinForms.dllを選択して開く。


レポート作成方法

新しいレポートを作成するときは、「共通項目」のカテゴリを探す。よそのサンプルでは「Reporting」のカテゴリにレポートがあるが、VS2017では違うらしい。

06.PNG

また、レポート作成時に警告が表示されるので、「信頼する」を押す。

07.PNG

↓デザイナの画面

01.PNG

↓ツールボックスからアイテムを選択して追加する。

02.PNG


日本語表示時の注意

フォントが英字用フォントだと、日本語が表示されない。既定値は「Arial」になっているので、日本語を表示できるフォントへ変更する。


一覧形式のレポートを作成する

ツールボックスで「一覧」を選び、レポートの本文へドラッグ&ドロップする。

初めて一覧を追加する場合、データセットの作成ウィザードが始まるので、適宜データソースを作成する。

一覧の列を追加するには、一覧上で右クリック→「列を挿入」→「左揃え」または「右揃え」を選ぶ。「左揃え」を選ぶと、クリックした列の左側に列が挿入される。

列に表示するデータを指定するには、列の右上に表示するアイコンをクリックして、列の一覧から表示したい列を選ぶ。

一覧に表示するデータを指定した様子。

デフォルトのままでは、一覧が複数ページに渡ったときに2ページ目以降でヘッダーが表示されない。

表示する方法


独自クラスで一覧を作成する

一覧の行データになるクラスを作っておく。

Public Class DataRow1

Private _column1 As String
Public Property Column1() As String
Get
Return _column1
End Get
Set(ByVal value As String)
_column1 = value
End Set
End Property

Private _column2 As String
Public Property Column2() As String
Get
Return _column2
End Get
Set(ByVal value As String)
_column2 = value
End Set
End Property

Private _column3 As String
Public Property Column3() As String
Get
Return _column3
End Get
Set(ByVal value As String)
_column3 = value
End Set
End Property
End Class

「レポートデータ」で「新規」→「データセット」を選ぶ。

「データソース」の「新規」を押す。

「オブジェクト」を選択して次へ。

追加したいクラスを選択して「完了」を押す。

選択したクラスのフィールドなどが追加されるので、OKを押す。

レポートファイルのデザイナで、「一覧」を追加する。

一覧(Tablix)のプロパティ「DataSetName」に、追加したDataSetの名前を指定する。


単票項目を作成してデータを表示する

ツールボックスから「テキストボックス」等を追加する。

テキストボックスの内部で右クリック→「プレースホルダの作成」を選ぶ。

「ラベル」にデザイナ上で表示する名前を入力する。

「値」は右側のボタンを押す。

カテゴリ「データセット」→表示したいデータのフィールドをダブルクリック。

設定後の様子。


用紙のサイズや向きを指定する

レポートファイルの外側の余白で右クリック→「レポートのプロパティ」を選択。

ページ設定画面が出るので、ここでサイズや向きを指定する。

プログラムから指定する場合は、PaperSizeクラスを使ってReportViewerの設定値を変更する。

ReportViewer1.PrinterSettings.DefaultPageSettings.PaperSize = new PaperSize("Custom", 100, 200)

PaperSize Class (System.Drawing.Printing) | Microsoft Docs


1ページ目のみ表示する

テキストや四角形を特定のページのみ表示させたいときの設定方法。

設定したいオブジェクトを選択し、プロパティウィンドウの「Hidden」で「<式...>」を選択する。

式の欄に、条件式を入力する。画面は1ページのみ項目を表示したいときの例。

=IIf(Globals!OverallPageNumber = 1, False, True)


レポートを表示する

フォームにReportViewerコントロールを追加する。

コントロールの右上の三角を押し、表示するレポートを選ぶ。

レポートのDataSetがオブジェクトの場合(に限るか不明)、BindingSourceが追加される。

行データの追加はそのBindingSourceに対して行う。

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For i = 0 To 4
Dim row As New DataRow1
row.Column1 = "列1"
row.Column2 = "列2"
row.Column3 = "列3"

Me.DataRow1BindingSource.Add(row)
Next

Me.ReportViewer1.RefreshReport()
End Sub
End Class

レポートを表示した様子。(列1と列2は英字フォントのままにしているので、日本語が表示されない)


表示するレポートをコードで指定する

Me.ReportViewer1.LocalReport.ReportEmbeddedResource = "WindowsApp1.Report1.rdlc"

レポートファイルが「埋め込みリソース」になっていることを確認すること。


印刷レイアウトで表示する

Me.ReportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout)

DisplayModeというプロパティもあるが、読み取り専用。


レポートの名前を指定する

ReportViewerのプロパティ → LocalReportDisplayName

レポートを印刷したときのドキュメント名などがこれになる。

指定しない場合、レポートのファイル名が出てきてしまう。


トラブルシューティング


1ページごとに空白ページが挿入されるとき

現象:

Viewerでレポートを印刷レイアウトで表示すると、1ページごとに空白ページが挿入されることがある。

解決策:

レポートの横幅がページからはみ出している可能性がある。

Body部の幅が、ページ設定のページサイズ+余白の中に収まっているか確認すること。

参考:reportviewer - Empty pages in RDLC-Report - Stack Overflow


ReportViewerコントロール追加時にエラーになるとき

現象:

あるソリューションでReportViewerを使用した後、別ソリューションで同じくReportViewerを参照に追加し、Formにコントロールを追加すると下記エラーになる。

原因予想:

ツールボックスへReportViewerを追加する手順が上手くいかなかったかもしれない。

解決策:

%localappdata%\Microsoft\VisualStudio\[バージョン番号?]\ProjectAssembliesフォルダの内容を、念のためバックアップを取りつつ削除する。


参考

Getting started with the ReportViewer 2016 control - SQL Server Reporting Services (SSRS) | Microsoft Docs

https://docs.microsoft.com/en-us/sql/reporting-services/application-integration/integrating-reporting-services-using-reportviewer-controls-get-started?view=sql-server-2017

Microsoft レポートによる帳票の作成 - Qiita

https://qiita.com/mima_ita/items/dd95ba1f25ba176fccb3

Microsoft Report の基礎の基礎 - Qiita

https://qiita.com/sebon77@github/items/a7ead91de9ab8a9860b2