50
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-03

前提条件

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

50
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?