たとえば、こんなテーブルがあったとして。
品目 |
コード |
金額 |
仕入日 |
モニタ |
001 |
100,000 |
2008-02-11 |
キーボード |
002 |
5,000 |
2008-02-12 |
マウス |
003 |
2,000 |
2008-02-13 |
HTML を Excel としてダウンロードさせると、下記のようになります。(環境やバージョンにより異なるかも)
品目 |
コード |
金額 |
仕入日 |
モニタ |
1 |
100,000 |
2008/2/11 |
キーボード |
2 |
5,000 |
2008/2/12 |
マウス |
33 |
2,000 |
2008/2/13 |
CSV などでも同様ですが、001とかは数値とみなされて1になってしまうのですね。
この場合だと、日付の形式も若干変えられています。
これでは困る。画面に表示されているのと同じ形式で表示したい!!
そんな場合、下記のような (x)html をダウンロードするようにすれば OK。
Excel で html 形式で保存するときに出力する形式から一部ぱくって来ただけです。
x:str 属性の値が表示されるので、td タグの内容は空になってもかまいません。
ただし、これをすると当然文字列として扱われるので、Excel のそれぞれのデータ形式の恩恵を受けたければ、その部分だけ外してやりましょう。
offiec 2000, XP, 2003 では大丈夫のはずです。
2007 でも、xls ならば警告は出るものの開いてくれます。
ですが、拡張子を xlsx にすると警告だけ出して開いてくれません。容赦なくお断りされます。
素直に OOXML を使えということでしょう。
万能ではありませんが CSV なんかでダウンロードするぐらいなら、HTML でダウンロードした方がはるかにマシです。
CSS である程度見た目をいじれるし、このように Excel 独自の問題も回避できたりします。
サーバに Excel 入れたくなくてもかまいません。条件は CSV と同じです。
各地の CSV の仕様のあいまいさを考えると、こっちの方が共通ライブラリ化しやすいかもしれません。
CSV はグリッド形式しか表現できませんが、HTML なら他の形式だって表現できます。
文字列でゴリゴリ組むなら、HTML の方がしんどそうですが、DataTable.GetXml() と XSLT でコードも簡潔です。
なおかつ、テンプレートとして外出しできます。
転送量の増大はどうしようもありませんが・・・・・
というわけで、さっさと CSV ダウンロードは消えてしまえキャンペーンでした。
[追記]
ちなみに、下記は残念ながらダメなんだよね。
テーブルと認識してはくれるのに、x:str 属性は認識してくれない。
だから、x:str 属性がない場合と同じ表示になってしまう。