misc.log

日常茶飯事とお仕事と

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

Responseによるダウンロードでxlsxが開けない件(2015年の試行錯誤備忘録)

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();

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

www.codeproject.com

指定可能なContentTypeについて下記あたりが参考になるかもしれません。

docs.microsoft.com

Content Typeの指定(2020年追記)

同僚と話していて、改めて検索してみるとコンテントタイプの指定がちょっと違うという話を見つけました。試せてませんが記録しておきます。ContentTypeをこれにすればいけるという話。

application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

applicationが2回重なってますが……ほんと?

www.codeproject.comstackoverflow.com