たぶん、やり方は2つ。
Silverlight アプリケーションでデータを生成し、ローカル保存するのが1つ目。
string csvData = "";
// カンマ区切りの文字列を csvData に設定
SaveFileDialog dialog = new SaveFileDialog();
dialog.DefaultExt = ".csv";
dialog.Filter = "データ | *.csv";
dialog.DefaultFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";
if (dialog.ShowDialog() == true)
{
using (var stream = dialog.OpenFile())
{
using (var writer = new StreamWriter(stream, Encoding.UTF8))
{
writer.Write(csvData);
writer.Flush();
}
}
}
CSVファイルの文字コードは shift-jis じゃないと Excel で開いたときに文字化けしてしまう。普通にファイル出力してしまうと、UTF-8 で出力される。とはいえ、Silverlight には標準で shift-jis にサクッと変換するすべは無い。だが、Excel も UTF-8 をサポートしているはずなので、調べてみたところ BOM(Byte Order Mark) が付与されているものであれば、UTF-8 でも開けるとのこと。
BOM を付与するには、StreamWriter の第二パラメータにちゃんと UTF8 ですよってつけてあげればおk。
DefaultFileName を未設定だと、保存ダイアログのファイル名のところが空になってしまい、設定しちゃうと、保存ダイアログ表示前に勝手に確認ダイアログが出るのが気に入らない。
UTF-8 じゃなくて shift-jis で出したい場合は、ちょっと手間だけど次の方法。
サーバーサイドで作ってダウンロードさせる。これが2つ目。
aspx 作って POST で返すのもいいけど、今回はジェネリックハンドラを使う。
まずはサーバーサイド。
/// <summary>
/// CsvDownload の概要の説明
/// </summary>
public class CsvDownload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string csvData = "";
// カンマ区切りの文字列を csvData に設定
context.Response.ContentType = "text/csv";
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv");
context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis");
context.Response.Write(csvData);
}
public bool IsReusable
{
get
{
return false;
}
}
}
これで、CsvDownload.ashx をクライアント側から呼び出すだけでおk。
呼び出し方はいくつかあって、Silverlight アプリケーションから直接呼び出す場合は、WebClient クラスを使ってバイトデータを読み出したあとに、1つ目と同じ方法で保存する。
javascript 側からリクエストする方法もいくつかある。
流れはjsにリクエストさせる為のメソッドを用意して、Silverlight側からCALLする。
☆js側
<script type="text/javascript">
function getCsv() {
}
</script>
☆SL側
HtmlPage.Window.Invoke("getCsv");
getCsv の中でHTTPリクエストをやるんだけど、まずは一番かっちょわるいやりかた。
新規Window作ってそこからリクエストする。
var w = window.open("CsvDownload.ashx", "csv", "width=1,height=1", null);
w.onload = function () {
w.close();
};
self.focus();
Windowが見えるのはやだよね。
これを回避する為には隠しiframeを使う。
var iframe = document.createElement("iframe");
if (iframe != null) {
iframe.style.display = "none";
iframe.onload = function () {
document.body.removeChild(iframe);
}
document.body.appendChild(iframe);
iframe.src = "CsvDownload.ashx";
}
ほかにも jQuery の ajax 使うのとか色々ありそうだけど、キリが無いので今日はここまで。
0 件のコメント:
コメントを投稿