Salesforceのエクセル/CSV出力で文字化けするときは、文字コードをUTF-8にすればよい(BOM付き)

SFDCからファイル出力を行うには、エクセル形式が便利です。

以前、「SOQLによる検索結果をエクセル出力するVisualForce画面の作り方(出力対象の選択を標準画面で行うやり方付き)」という記事を書いたのですが、そのときは、文字コードの指定がMS932だったので、内部でUTF8で文字列情報を持っているSalesforceと際が生じ、「・」などの文字が「?」となってしまっていました。

しばらく解決策を知らなかったのですが、先日、一気に2つ解決方法が分かったのでメモしておきます。

方法① エクセル出力の文字コード指定を「UTF-8」にする

先入観から、エクセル出力時の文字コードはShift-JISしか無理だと思っていましたが、「UTF-8」という指定をすればそのまま文字化けせずに出力できました。。。

以前の記事でご紹介したソースのcontentTypeの部分を以下のように設定すればOKです。

contentType="application/vnd.ms-excel#ExportList.xls; charset=UTF-8"

これで、「・」なども文字化けせずにエクセル出力できます。

P.S. 後日別な環境で試したら、下記の「utf8Bom」も入れないと文字化けしてました。なので、「utf8Bom」の対応も追加します。

方法② UTF-8のcsv出力にする

エクセル出力だけでなく、csvで出力することも可能です。

エクセルで出力できればよいという意見もあるでしょうが、エクセルが入っている環境ばかりではないので、ソリューションのひとつとして記載しておきます。

なお、そのまま文字コードUTF-8のcsvで出力すると、「BOMなし」になり、ダブルクリックしてエクセルで開いたときに文字化けしてしまいます。これを防ぐには「BOM付き」のUTF-8で出力する必要があるので、ちょっとしたテクニックをご紹介します。

ソースコードはこちらから。

UTF-8のcsvで出力するVisualForceページは以下のように。

contentType="application/vnd.ms-excel#filename.csv;charset=UTF-8;"

を使います。全体では以下のようになります。

2つばかり、重要なポイントを記載します。

  • ヘッダ行は「apex:page」タグの直後に書く
    通常のVisualForceページのように「apex:page」タグの下から書くと、ファイル出力したときに1行目に空行ができてしまいます。
    1行目からヘッダ行を出力するには上記のようにしましょう。
  • BOMを挿入する
    Controller側に下記のような「utf8Bom」というメソッドを追加し、VisualForceのヘッダを書く前に呼びます。
public String utf8Bom {get {return '\uFEFF';} private set;}