[CrystalReports]データ長さに応じてフォントサイズを調整する


CrystalReportsを使用して帳票印刷を行う際、印字するテキストが長すぎてフィールドの枠内に入りきらない場合、印字が欠けてしまいます。
このような場合、Excelだったら「縮小して全体を表示」という書式設定をしておくと、印字内容のデータ長に合わせて自動でフォントサイズを縮小させる事ができるのですが、残念ながらCrystal Reportsには、これと同じ機能は有りません。


そこで、今回はCrystal Reportsで、印字するデータの長さに応じてフォントサイズを調整させる方法を説明します。

データ長に応じたフォントサイズを指定する

今回の例では、下記帳票レイアウト(.rptファイル)内にある、Nameフィールドのフォントサイズを調整してみます。
ちなみにこの項目はデータセットのRepAddressLabel.Nameフィールドにバインドされています。


Nameフィールドを右クリックし、オブジェクトの書式設定を選択します。



フォントタブの、サイズの横にある”x+2″と書かれた小さいボタンをクリックします。



式ワークショップウィンドウが表示されるので、以下の式を入力します。


If ( Length( {RepAddressLabel.Name} ) < 24 ) Then
    12
Else If ( Length( {RepAddressLabel.Name} ) < 28 ) Then
    10
Else
    9


これは、プログラム側でセットされたRepAddressLabel.Nameフィールドのデータ長が、24文字未満の場合は12ポイント、28文字未満の時は10ポイント、それ以上の場合は8ポイントにフォントサイズを変更させる事を意味します。(各ポイントで何文字分の印字が可能かは試行錯誤して求めます…)


この設定を行った後にプログラムを実行すると、確かに指定した文字数以上でフォントサイズが切り替わるようになりました。





2バイト文字を含む項目に対応する

ただ、ここで注意が必要なのはLength()関数は文字のbyte数ではなく、文字数を返す事です。
この為、上記例のように全角と半角が混在する場合、ちょうど良い位置でフォントサイズを切り替える事ができなくなってしまいます(半角しか表示されない項目の場合は、前述の方法で問題ないです)。

Crystal Reportsの式として用意されている関数にはバイト数を取得する方法がありません。
この為、本問題に対処するためにはプログラム側からデータのbyte数を隠し列として渡してあげる必要があります。

下記の例はC#側でデータセットに印字内容をセットする処理です。
Name_LenBというフィールドに,プログラム側でデータ長をセットしています。

    DataSet1.RepAddressLabelDataTable table = new DataSet1.RepAddressLabelDataTable();
    [中略]
 
    dataRow = (DataSet1.RepAddressLabelRow)table.NewRow();
    dataRow.Name          = ...;
    dataRow.Name_LenB     = Encoding.GetEncoding("Shift_JIS").GetByteCount( dataRow.Name );




その上で、該当フィールドの式ワークショップで、式を以下のように変更します。


If ( {RepAddressLabel.Name_LenB} < 24 ) Then
    12
Else If ( {RepAddressLabel.Name_LenB} < 28 ) Then
    10
Else
    9



これで、2バイト文字を含むデータでも、適切にフォントサイズを調整出来る様になります。

関連記事

コメントを残す

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