Responseによるダウンロードでxlsxが開けない件(2015年の試行錯誤備忘録)
ASP.NETにて、xlsx形式のデータ(っても実体はHTML形式)をResponse.Writeで返し、無理やりExcel 2010などで開かせようとしたのですがうまくいかず。2003形式だとできるのにね。
おそらく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();
下記サイトのコメントについていたコードを参考にさせてもらいました。
指定可能なContentTypeについて下記あたりが参考になるかもしれません。
Content Typeの指定(2020年追記)
同僚と話していて、改めて検索してみるとコンテントタイプの指定がちょっと違うという話を見つけました。試せてませんが記録しておきます。ContentTypeをこれにすればいけるという話。
application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
applicationが2回重なってますが……ほんと?