[C#,VS2010]CrystalReportsで宛名ラベルを印字する(横方向へ明細データの繰返し)

前回は、CrystalReports作成したデータをPDF形式で出力させる方法を説明しました。

今回の記事では、宛名ラベルのような複数データを横方向に繰り返し印刷する帳票の作成方法を説明します。


今回のお題

印字内容は、純粋な宛名ラベルだったら「郵便番号+住所+氏名」程度ですが、今回は通販での注文配送をイメージして下記の項目を印字してみる事にします。

postalCode      郵便番号
region          都道府県
addressLine1    住所(1行目)
addressLine2    住所(2行目)
addressLine3    住所(3行目)
name            氏名
orderId         注文ID
sku             商品ID
labelId         ラベルID
headerText      上部に印刷する付加情報



また、宛名を印刷するラベルは下記の商品を想定します。


各ラベルのサイズは66×22.9mmで、上・左の余白はそれぞれ12.9mmと6mmです。



データセット定義

まずは、前々回と同様DataSetのフィールド定義を行います。
データ型は全てStringです。



レイアウト定義

次に、レイアウト定義を行います。
例によって、メニューより”プロジェクト→新しい項目の追加”をクリックし、”Reporting→Crystal レポート”を選択します。



レポートウィザードを使用で、エキスパートの使用は標準を選択します。
ここで思わずエキスパートの使用で”宛名ラベル”を選択したくなるところですが、宛名ラベルを選んでレイアウトを生成させると明細欄が非常に編集しにくい(実際に一度やってみると分かります)ので、あえて”標準”で雛形を作った後にプロパティを変更する事にします。



データは、先ほど作成したDataSetを指定します。


フィールドは全項目を選択します。


グループ化、レコードの選択はデフォルトのまま次へをクリックします。
[画像無し]


スタイルは”標準”でOKです。



自動生成された帳票レイアウトは、以下の通りです。
これをベースに、宛名シール用へ定義を変更していきます。



ヘッダ部のレイアウト定義

まずは、レポートヘッダ、フッタの高さを0にします。
レポートヘッダのタイトルをクリックし、Heightを0にします。(フッタも同様)
また、フッタの右端にページ番号のコントロールがあるので、ページヘッダに移動しておきます(宛名ラベル上部の余白に印刷させます)。




次にページヘッダの高さをセットします。
heightにセットする値は単位がtwipというもので、1440twipが1インチ(2.54cm)に相当します。

今回のレイアウトでは、上部余白が12.9mmのシールに印刷したいので…
1.29(cm) / 2.54(cm/inch) * 1440(twip/inch) ≒ 731.338(twip)
となり、731をセットします。

ヘッダにあったタイトルは、宛名ラベルでは不要なので全て削除します。
また、DataSetで定義したheaderTextフィールドは、ページヘッダ用なのでヘッダ欄に移動させます。

ページヘッダ部を設定した後の状況は以下のような感じになります。



詳細部のレイアウト定義

ヘッダができたら次は明細部の定義を行います。
こちらも、まずは高さを設定します。

今回のレイアウトでは、高さが33.9mmのシールに印刷したいので、以下の式により1929を指定します。
3.39 / 2.54 * 1440 ≒ 1928.897

高さを変えたら、明細部にあるフィールドの各コントロールを左の方に寄せておきます。




この状態で、もし印刷を行うとラベルの左端のみ印刷できる状態になりました。
ですが、今回は1行に3枚のラベルがある為、横方向の繰り返し処理を定義する必要があります。

横方向の繰り返しを行うには、詳細のタイトルを右クリックし「セクションエキスパート」を選択します。


左側で詳細が選ばれているのを確認し、右側共通タブの「複数の列で書式設定」にチェックを入れます。


チェックを入れると、レイアウトタブが追加されます。



レイアウトタブに移ると、詳細バンドの幅を指定する事が可能です。
ここはcm単位で指定可能なので、そのまま設定します。


設定を行うと、明細バンドのタイトル幅が短くなりました。


また、他に印字項目のフォントサイズ・書式の変更も行いました。
以上で、レイアウト作成処理は官僚です。


帳票発行のデータセット処理


以下のような感じで、テストデータの作成&レポートの印刷処理を行います。
ここの考え方は、前回までと特に変更ありません。

private void button1_Click( object sender, EventArgs e ) {
    // レコード定義を行う
    DataTable table = new DataTable();
    table.Columns.Add("postalCode",   Type.GetType("System.String"));
    table.Columns.Add("region",       Type.GetType("System.String"));
    table.Columns.Add("addressLine1", Type.GetType("System.String"));
    table.Columns.Add("addressLine2", Type.GetType("System.String"));
    table.Columns.Add("addressLine3", Type.GetType("System.String"));
    table.Columns.Add("name",         Type.GetType("System.String"));
    table.Columns.Add("orderId",      Type.GetType("System.String"));
    table.Columns.Add("sku",          Type.GetType("System.String"));
    table.Columns.Add("labelId",      Type.GetType("System.String"));
    table.Columns.Add("headerText",   Type.GetType("System.String"));
 
    for ( int loop = 0; loop < 20; loop++ ) {
        // テスト用印字データを追加
        DataRow row;
        row = table.NewRow();
        row["postalCode"]   = "〒111-1111";
        row["region"]       = "東京都";
        row["addressLine1"] = "千代田区 丸の内 一丁目1番地1192";
        row["addressLine2"] = "セントラルレジデンス昭和荘12F 24号室";
        row["name"]         = "鈴木一郎" + " 様";
        row["orderId"]      = "xxxx-xxxx";
        row["sku"]          = "SKU0001";
        row["labelId"]      = loop.ToString( "0000" );
        row["headerText"]   = "PrintDate=2012/12/24 12:12:12; LastOrder=xxxx-xxxx(1223_235959); Qty=7";
        table.Rows.Add(row);
    }
 
    // 印字データをセット
    crystalReport1.SetDataSource( table );
    crystalReport1.Refresh();
 
    // プリンタに印刷
    crystalReport1.PrintToPrinter( 0, false, 0, 0 );
}





動作確認

プログラムを実行すると、以下のように横方向の繰り返しがある宛名ラベルが作成できました。
氏名の下にある連番を見ると分かりますが、ラベルは横方向に順に印刷されます。




印刷方向を縦にしたい場合は、前述の”明細セクションのレイアウト”タブで、印刷方向を「縦から横」に変更します。


変更後に再実行してみると、縦方向に順に印刷されている事が確認できます。

関連記事

コメントを残す

メールアドレスが公開されることはありません。