PDF、Excel、CSV の出力

HTML 以外への出力

Salesforce では、Visualforce のオプションで、出力した HTML を PDF に変換することができます。また、Excel や CSV への出力も可能です。そういった HTML 以外へのフォーマット出力において、注意しなければいけない内容を記載します。

PDF 出力

<apex:page> のプロパティにrenderAs="pdf" と指示すると、その Visualforce を PDF へ変換してクライアントに表示します。ただし、通常の HTML ではできるのに、PDF に変換するとできなくなることが何点かあります。

1. 改行

TD の幅を超える文字列の長さでも、自動改行は一切してくれません。そのため、表示幅に対してそれを超える長い文字列を表示する場合は、改行位置に <br/> を差し込む必要があります。 表示幅に合わせて自動改行して表示する場合は、 文字列を出力する際、幅に合わせた場所で自動的に <br/> を入れる処理が必要となります。この場合、文字数で換算すると、半角全角が入っていた時、想定外の位置で改行が入ってしまう可能性があります。つまり、ダブルバイト文字を表示しなければいけない、かつ改行がありえる場合はバイト数でカウントし、幅に合わせて自動的に <br/> を差し込むという形にする必要があります。

2. 改ページ

見積と見積明細のような明細行を複数行表示するような PDF の場合。 改ページが必要な場合は、改ページの指示である <div style="page-break-after:always;" /> を入れてあげる必要があります。1ページに収まる行数を換算し、その行数分出力したら改行指示を入れる。続けて明細行を出力し、そのページに入らなくなったらまた改行指示を入れる。そういった仕組みが必要となります。

3. フォント

Visualforce の機能で PDF を出力する場合、日本語フォントは Arial Unicode MSの1種類です。これがまた普段お目にかかることのない特殊なフォントとなっています。漢字の場合、常用漢字とは言えないような形で表示してくれる場合もあります。お客さんの名前を表示する場合、それをなかなか許容できない場面もあります。そういった場合は、Visualforce で出力すことは諦めて、別途帳票サービスを契約することを考えてください。

Excel 出力

出力する Visualforce の ContentType を application/vnd.ms-excel とすることで、Excel ファイルを出力することもできます。ただし、Visualforce で出力するので中身は HTML です。つまり、正しくは Excel の機能が HTML を Excel で表示してくれているということになります。

1. 保存

中身は HTML なので、Excel ファイルとして保存する場合は、Excel ファイルへの変換が必要です。Excel で開き、新規保存で Excel フォーマットを指定して保存する必要があります。

2. 印刷範囲

出力時に印刷範囲の指定を行うことはできません。そのため、印刷を行う場合は、別途印刷範囲の指定を行う必要があります。

3. 結合

HTML で指定できるセルの結合も Excel 上で実現できます。ただし、複雑な結合を行っていると、指定した通りの結合表示になってくれないことがあります。これがどういったパターン、どういったことを理由にそうなるのかまで突き止められてはいません。しかし、そうなる可能性があります。ただ、今まで見てきた中では、イメージ通りの出力にはなっているので、印刷用としての表示であればそれほど気にすることではないように思えます。

4. 一元管理から外れる

Excel に出力すると編集可能なメディアとして存在します。そのため「Salesforce 上での一元管理」というテーマから外れる運用ができてしまうことになります。Excel を最新情報に更新してはいるが、Salesforce 上のデータは更新していない、という状況が起こりえることになります。運用上、Excel 利用に関してのルールを十分検討しておく必要があります。

CSV 出力

Excel の出力時と同様、出力する Visualforce の ContentType を application/vnd.ms-excel、もしくは text/csv とし、拡張子を CSV とすることで CSV ファイルも出力することができます。

1. 表示

Windows で CSV ファイルを開くと、通常 Excel が起動します。しかし、Excel は CSV ファイルを Shift_JIS として開くので、charset で Shift_JIS、もしくは Windows-31J を指定しないと必ず文字化けします。そのため、charset を指定しない場合に Excel で開く際は、一回メモ帳などで保存しなおして BOM(Byte Order Mark)付きにしてから開きなおす必要があります。ただし、Excel 以外のツールではそのまま開くことができる場合もあるので、その限りではありません。なお、前述した HTML ファイルを Excel フォーマットで開く場合は、UTF8 を認識して開いてくれるので、charset の指定や文字化けを心配する必要はありません。

全体的に

PDF、Excel、CSV それぞれで出力するにしても、結局は Visualforce で作成します。つまり、Visualforce の制限範囲を超えることはできません。

1. 行数

Visualforce 内での 1コレクション で取得できる総行数は1,000行までです。ただし、ReadOnly が設定可能な場合は、10,000行まで増えます。ReadOnly を設定した場合は、ヘッダと明細の PDF 出力はおそらく問題ない範囲だと思います。しかし、CSV 出力の場合を考えると、10,000件は結構制限が厳しいと思うので条件指定などを検討する必要があります。

2. その他ガバナ制限

出力する際に DML を発行したり、複数のオブジェクトへの SOQL を発行する場合は、 それに該当するガバナ制限を考慮する必要があります。

まとめ

前述した前提条件の下であれば、Salesforce から外部ファイルを出力することも可能です。 見積書を PDF で出力したい、スケジュール表を Excel で出力したい、他システムへ取り込むための CSV ファイルを出力したい、 などの要望も、Visualforce を駆使して実現することは可能です。