前提条件
Visual Studio 2017
はじめに
.NETで帳票出力といえば昔はCrystalReportsだったが、いつからか無くなった。
それ以降、帳票出力したいなら商用ツールを購入するのが定石かと思っていたが、Microsoft公式の帳票出力ツールがあったらしい。それがMicrosoftレポート。
インストール
公式とはいえ、最初からVisual Studioに含まれてはいないので、インストールが必要。
インストール手順の動画(英語)
https://youtu.be/70uUsC5GFgk
- Visual Studioのメニュー → ツール → 拡張機能と更新プログラム を選ぶ。
- 左側で「オンライン」を選び、検索エリアに「rdlc」と入力する。すると「Microsoft RDLC Report Designer」が出てくるので、ダウンロードボタンを押す。
- 下部にVisual Studioを終了させるように促すメッセージが出るので、ウィンドウを閉じてVisual Studioを終了させる。
- 終了させた後しばらく待っていると(待ち時間はPCスペックによるかも)、インストーラの画面が起動するので、「変更」を押す。
- しばらく待っているとインストールが完了するので、インストーラを閉じて、Visual Studioを起動する。
ReportViewerコントロールの追加
拡張機能をインストールしただけでは、WindowsフォームコントロールにReportViewerが追加されない。
- プロジェクトで右クリック→「NuGetパッケージの管理」を選ぶ。
-
Microsoft.ReportingServices.ReportViewerControl.WebForms
またはMicrosoft.ReportingServices.ReportViewerControl.WinForms
を探してインストール。
- インストールが完了すると、ツールボックスにReportViewerが追加されている。
ちなみに、ReportViewerコントロールは、SQLServer上に作ったレポートファイルも表示できる。
※ ツールボックスにReportViewerが無い場合
- ツールボックスで右クリック→「アイテムの選択」を選ぶ。(もしくは、メニュー→「ツール」→「ツールボックスアイテムの選択」)
- 「参照」を押す。
-
ソリューションフォルダ\packages\Microsoft.ReportingServices.ReportViewerControl.Winforms.150.900.148\lib\net40
にあるMicrosoft.ReportViewer.WebForms.dll
またはMicrosoft.ReportViewer.WinForms.dll
を選択して開く。
レポート作成方法
新しいレポートを作成するときは、「共通項目」のカテゴリを探す。よそのサンプルでは「Reporting」のカテゴリにレポートがあるが、VS2017では違うらしい。
また、レポート作成時に警告が表示されるので、「信頼する」を押す。
日本語表示時の注意
フォントが英字用フォントだと、日本語が表示されない。既定値は「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のプロパティ → LocalReport
→ DisplayName
レポートを印刷したときのドキュメント名などがこれになる。
指定しない場合、レポートのファイル名が出てきてしまう。
トラブルシューティング
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