読者です 読者をやめる 読者になる 読者になる

misc.log

日常茶飯事とお仕事と

ASP.NETでExcel形式のデータを返す

ちょっとした調査で、ASP.NETのWebアプリからExcelで開けるデータを送り返すテストを行うことに。文字コードの部分でちょっと引っかかったのでメモしておきますね。以前、PHPの案件でも同じところで引っかかったのですが。

Excel形式を指定してResponseで返す

Excelで開けるファイルを返すには、ResponseオブジェクトのContentTypeを以下のように設定する必要があります(言語はC#)。

Response.ContentType = "application/vnd.ms-excel";

これで、データがなんであれExcelで開くファイルとしてブラウザが認識してくれます。で、こんな感じで、適当に用意したボタンのクリックイベントに処理を書くと……

Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "inline; filename=sample.xls");
Response.Write("<table><tr><td>1</td><td>テスト</td></tr></table>");
Response.Flush();
Response.End();

ダウンロードはできるのですが、こんな感じになってしまいます。

f:id:frontline:20150413163839p:plain

化けてますね。UTF-8の文字列をShift_JISで表示しちゃった場合の結果に似てます。

Responseに文字コードを指定する

ということで、レスポンスオブジェクトへ「ContentEncoding」の指定を行い、Shift_JIS指定したEncodingオブジェクトを渡してやります。

Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = Encoding.GetEncoding("shift_jis");
Response.AddHeader("content-disposition", "inline; filename=sample.xls");
Response.Write("<table><tr><td>1</td><td>テスト</td></tr></table>");
Response.Flush();
Response.End();

これで正しく表示されました。

f:id:frontline:20150413164046p:plain

文字列自体をSJISにしてもダメでした

ちなみに、ContentEncodingをSJIS指定するのではなく、Writeメソッドに渡す文字列自体をByte配列からSJISでGetStringした結果にしてみたのですが、これではダメでした。Webサーバb-からブラウザにわたる時点でUTF-8に戻されるんですかね?

文字コード「超」研究 改訂第2版

文字コード「超」研究 改訂第2版

漢字問題と文字コード

漢字問題と文字コード