マイクロソフト謹製Microsoft Reportで帳票を作る

job_programmer C#
CopyRight https://www.irasutoya.com/

帳票は日本独自の文化と言われますが、ちょっとしたものでも印刷のニーズは結構ある気がします。

Active Reportsなど有償製品は高機能だけど高価。とはいえ、PrintDocumentをゴリゴリ書くのは結構大変ですよね。なにかいい方法ないかな・・・と探していた時に偶然見つけたのがMicrosoft Report(ReportViewer)。マイクロソフト謹製なのでVisual Studioとの相性も良さそう!と思ったのですが、意外に欲しい情報を見つけるのに苦労したので覚書として記します。

作業環境

Windows 11 Pro+Visual Studio 2019 Community(C#.NET)です。

下準備1

マイクロソフト謹製なのですが、素のVisual Studioでは使えません。拡張機能の管理を選択し「オンライン」のタブをクリックしたら「Microsoft Rdlc Report Designer for Visual Studio」を検索→インストールします。

ウィザードに従うだけですので以後省略。

下準備2

WindowsFormアプリケーションで新たにプロジェクトを作成します(.NETのバージョンは4.8を選択しました)。続いてツール→NuGetパッケージマネージャーから「Microsoft.ReportingServices.ReportViewerControl.Winforms」を検索します。

こちらをインストールします。

大雑把な流れ

Form2とReport1を追加。Form1にはボタンを1つ設置し、このボタンをクリックしたらレポート(Form2)が表示されるような仕掛けにします。

Form1の内容

Button1_ClickでForm2を表示させます。

namespace sandambara
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show();
        }
    }
}

Form2の内容

実際にレポートを表示させる部分(ReportViewer)をFormに設置します。

レポートを作成したことの無い方には伝わりにくいかもですが、Formが土台、その上にViewerがのっかっていて、その中にレポートが表示されるイメージです。テレビに例えるとFormが本体外枠、Viewerが画面、Reportが映像・・・と例えれば伝わるでしょうか?

これをフォームに設置します

設置したら「親コンテナーにドッキングする」をクリックするとFormいっぱいにViewerが広がってくれます。Choose Reportはプロジェクトに追加しておいたReport1.rdlcを指定しておきましょう。

これが
こうなる

このときのコードはこんな感じです。

namespace sandambara
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.reportViewer1.RefreshReport();
        }

    }
}

レポートの準備

データセットを使ったレポートの作り方はたくさん見つけられるので、今回はレポート生成時に値を渡して表示させることをゴールとします。

まず、ソリューションエクスプローラーでReport1.rdlcを選択し、プロパティの「出力ディレクトリにコピー」を「常にコピー」へ変更します。

今Visual Studioの画面はこんな風になっていると思います。

今回はここへ3つの文字列を表示させます。

画面左側の「レポートデータ」の「新規」をクリック→パラメータを指定します。

こんな画面が表示されますので、そのままOKをクリックします。これをあと2回繰り返してReportParameter1とReportParameter2、ReportParameter3を作成しましょう。

こんな感じになります

つぎに、受け取ったパラメータを表示するテキストボックスを配置します。

これをレポート上に配置します
テキストボックスを3つ設置しました

テキストボックスのフォントはArialがデフォルトになっています。日本語を表示できるよう何か適当なフォント(MS Pゴシックなど)に変更しておきましょう。

次に、先ほど作成したReportParameter1-3をそれぞれテキストボックスへドラッグアンドドロップします。

以上でレポートの準備が整いました。続いてForm2(ReportViewer側)を仕上げます。

先人に感謝を捧げましょう

今回やりたいことがなかなか実現できずググり続けて数日。ここがなかったら折れていたと思います。多謝!ReportViewerコントロール|Aoplanning

Form2にレポートへ渡すパラメータをセットする

Form2.csへusingを追加します。

using Microsoft.Reporting.WinForms;

続いてForm2_Loadをモディファイします。


private void Form2_Load(object sender, EventArgs e)
{
    // レポートへ渡す文字列
    string _param1 = string.Empty;
    string _param2 = string.Empty;
    string _param3 = string.Empty;

    // ここにDBから値を取ってくる処理

    // DBからとってきた文字列を変数へ格納
    _param1 = "ほしいものリスト";
    _param2 = "生ビール";
    _param3 = "焼肉";

    // レポートファイル指定
    // Report1.rdlxのプロパティ→完全パスを参照
    reportViewer1.LocalReport.ReportPath = @"C:\Users\sandambara\source\repos\sandambara\sandambara\Report1.rdlc";
    
    // レポートファイルに渡すパラメーター
    ReportParameter[] rpt = new ReportParameter[3];

    // パラメータ値セット
    rpt[0] = new ReportParameter("ReportParameter1", _param1);
    rpt[1] = new ReportParameter("ReportParameter2", _param2);
    rpt[2] = new ReportParameter("ReportParameter3", _param3);

    try
    {
        // パラメータ適用
        reportViewer1.LocalReport.SetParameters(rpt);
    }
    catch (Exception ex)
    {
        // レポートファイルが見つからないとここでエラーになります。
        MessageBox.Show(ex.Message.ToString(), "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
        this.Dispose();
        return;
    }

    // プレビュー表示
    reportViewer1.SetDisplayMode(DisplayMode.PrintLayout);

    reportViewer1.RefreshReport();
}

さあ、実行してみましょう!

ボタンをクリックしてみよう
良く見えないので拡大してみると・・・
大成功!!!

まとめ

全部終わってからCrystal Reportsの存在を思い出してブルーになりました。

コメント