misc.log

日常茶飯事とお仕事と

拡張子 xlsx のExcel 2007/2010/2013データをResponseで返す

とりあえず備忘録。

ASP.NETにて、xlsx形式のデータ(っても実体はHTML形式)をResponse.Writeで返し、無理やりExcel 2010などで開かせようとしたのですがうまくいかず。2003形式だとできるのにね。

f:id:frontline:20150511182602p:plain

おそらくOpenXMLの規格とかにマッチしていないから開けないのね。ということで、Responseによるダウンロードのテストを行いたかっただけなので、Webサーバー側で実ファイルとして用意したものを無理やりバイト配列として読んでから、Response.OutputStream.Writeで送り出すという方式でやってみた。とりあえずできた。

// 書き出し用データをファイルから読む
byte[] source = System.IO.File.ReadAllBytes("C:/TestDocs/サンプル.xlsx");

// Excel形式でデータをダウンロードさせる。
Response.Buffer = true;
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.ContentEncoding = Encoding.GetEncoding("shift_jis");
Response.AddHeader("content-disposition", "attachment;  filename*=utf-8''" + HttpUtility.UrlEncode("サンプル.xlsx"));
Response.BufferOutput = true;
Response.OutputStream.Write(source, 0, source.Length);
Response.End();

下記サイトのコメントについていたコードを参考にさせてもらいました。

content type for xlsx file/CodeProject
http://www.codeproject.com/Questions/481262/contentplustypeplusforplusxlsxplusfile

指定可能なContentTypeについて公式情報は下記。

Description of the default settings for the MimeMap property and for the ScriptMaps property in IIS
https://support.microsoft.com/en-us/kb/936496/en-us