山田健一のブログ

業務に強いフリーITエンジニア 山田健一のブログです

.NET で使用できる帳票ツールについて(15)

私はフリーITエンジニアとして、業務分析、業務改善提案を含む設計、製造、受入検査を含む検査、システム運用開始後の運用改善提案など、様々な分野を担当しています。

「.NET で使用できる帳票ツールについて」の続編です。

今回は VB-Report の続きです。

「セクションレポート」を利用して、改ページのコードから開放されるかを試して見ました。

作りたいレポートは次のようなものです。

f:id:yamadaken1:20151221165517j:plain

これは、ExcelファイルをPDF化したもので、Excelファイルは次のようなものです。

f:id:yamadaken1:20151221165548j:plain

 

このようにExcelファイルが存在する場合、VB-Report のデザインファイルは容易に作成可能です。

デザインファイルは次のようになります。

f:id:yamadaken1:20151221165801j:plain

データ行の1行目を ** + フィールド名 に置き換えるだけです。
この時、セルの書式設定を変更しないように注意します。
例えば、「**issuedate」の書式は次のようになっています。

f:id:yamadaken1:20151221165834j:plain

帳票作成のコードは次のようになります。


            // 執筆書籍一覧
            CellReport cellReport1 = new CellReport();

            cellReport1.FileName = Path.Combine(Program.GetTemplateDirectoryPath(), "BookListTemplate.xlsx");
            cellReport1.Report.Start();
            cellReport1.Report.File();

            // 2. 連続帳票処理を開始します。
            cellReport1.Section.Start("Sheet1", false);
            // 3. 帳票のヘッダ、フッタの位置を指定します。
            cellReport1.Section.Header("1:3");
            // フッター定義なくても指定が必要
            // フッター不要の時は、テンプレートのフッター部分を非表示にするとよい
            cellReport1.Section.Footer("5");
            // 4. 各オプションを設定します。
            // MaxDetailCount は、大きく指定してもあふれた分は次ページに送られる
            //cellReport1.Section.MaxDetailCount = 17;
            // MaxDetailCount = 0 は自動(嬉しい機能)
            cellReport1.Section.MaxDetailCount = 0;
            // 空行でページを埋めたいときは ReportToFill = true
            //cellReport1.Section.ReportToFill = true;
            // 5. 帳票の明細行の位置を指定します。
            SectionDetail sectionDetail = cellReport1.Section.Detail("A4:I4");
            //データベース接続
            conn.ConnectionString = connectionString;
            // 接続します。
            conn.Open();
            // Q_EntryCount を読む
            OleDbCommand command = new OleDbCommand();
            command.CommandText = SqlClass.Sql執筆書籍一覧;
            command.Connection = conn;
            OleDbDataReader reader = command.ExecuteReader();
            int fieldCount = reader.FieldCount;
            // 結果を表示します。
            while (reader.Read())
            {
                // 6. 帳票の明細処理を開始します。
                sectionDetail.Start();
                // 7. 帳票の明細部にデータを設定します。
                for (int i = 0; i < fieldCount; i++)
                {
                    sectionDetail.Cell("**" + (string)reader.GetName(i)).Value = reader.GetValue(i);
                }
                // 8. 帳票の明細処理を終了します。
                sectionDetail.Next();
            }
            // 9. 連続帳票処理を終了します。
            cellReport1.Section.End();
            cellReport1.Report.End();

            // 接続を解除します。
            conn.Close();
            ViewerControl viewerControl1 = new ViewerControl();
            viewerControl1.Clear();

            viewerControl1.Document = cellReport1.Document;
            // PrintOut メソッドで印刷します。
            viewerControl1.PrintOut();


作成したレポートは次のようになります。

 

f:id:yamadaken1:20151221170753j:plain

DataReader 作成のコードと
Section.Header
Section.Footer
Section.Detail
の部分を変更するだけで、共通コードになります。

ただし、このセクションレポート機能は、若干不安定な印象を受けます。
例えば、このレポートの場合、フッターは不要ですが、Section.Footer の設定を省いてしまうとエラーもなく、正しくないレポートを作成してしまいます。

いずれ修正されるとは思いますが。

 

今回を持って、「.NET で使用できる帳票ツールについて」のシリーズを一旦終了にしたいと思います。

 

[2015/12/22 追記]-------------------------------------------------------------------------------------------

フッターを指定しなかった場合に、正しくないレポートを出力する件についてサポートに問い合わせたところ、

「Section.Start メソッドを呼び出したタイミングで ErrorNo.Paramが発生しています」

とのことでした。

cellReport1.ErrorNo

で確認できます。


                sectionDetail.Start();
                if (cellReport1.ErrorNo != ErrorNo.NoError)
                {
                    MessageBox.Show("エラー発生:"
                         + cellReport1.ErrorNo.ToString());
                    return;
                }

のようなコードで確認できます。
その他、Errorイベントを捕捉することも可能です。

ErrorイベントについてはHelpの
[目次]
- [基本操作]
- [イベントを実装する]
- [クライアントコンポーネント]
- Error イベントを実装する(C#)
を参照してください。

サポートが親切で好感が持てます。