ちょっとした調査で、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();
ダウンロードはできるのですが、こんな感じになってしまいます。
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();
これで正しく表示されました。
文字列自体をSJISにしてもダメでした
ちなみに、ContentEncodingをSJIS指定するのではなく、Writeメソッドに渡す文字列自体をByte配列からSJISでGetStringした結果にしてみたのですが、これではダメでした。Webサーバb-からブラウザにわたる時点でUTF-8に戻されるんですかね?

- 作者: 深沢千尋
- 出版社/メーカー: ラトルズ
- 発売日: 2011/07/19
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 8回
- この商品を含むブログ (4件) を見る

- 作者: 小池和夫
- 出版社/メーカー: 太田出版
- 発売日: 1999/09
- メディア: 単行本
- クリック: 1回
- この商品を含むブログ (6件) を見る