- PR -

CSVダウンロード時にExcelでうまく表示されない

1
投稿者投稿内容
ぴあにか
会議室デビュー日: 2004/07/01
投稿数: 5
お住まい・勤務地: 東京
投稿日時: 2004-07-01 20:25
CSVをダウンロードする機能を作っているのですが、
ダウンロードダイアログで「開く」を押した際に、
表示されたCSVがうまくセルに分かれず、
一つのセル内にカンマ区切りで1行のデータが表示されてしまいます。
解決策をご存知の方がおられましたら、ご教授願います。

【実装方法】
Servletにて、JSPを呼び出し、
そのJSP内で下記のようにContent-Type,Content-Disposition
を指定しています。

<%@ page language="java" contentType="application/download; charset=Shift_JIS" buffer="none"%>
<%
response.setHeader("Content-Disposition", "inline; filename=\"test.csv\"");
%>"aa","bb","cc","dd","ee"

ダウンロードダイアログで
「開く」を押した時、"aa"、"bb"は違うセルで表示されて欲しいのですが、
1つのセル内に、"aa","bb","cc","dd","ee"が表示されてしまいます。

ダウンロードダイアログで「保存」を押して一度ローカルに保存し、
再度Excelで開いた場合には、うまくセルに分かれて表示されます。

以上、よろしくお願いいたします。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-07-02 09:51
カンマ区切りではなく、TAB区切りではどうですか?
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-07-02 10:10
JSP がどんな Servlet に変換されているか確認できますか?

多分、スクリプトレットで ServletResponse#setHeader を実行する前に
ServletResponse#getPrintWriter を実行してしまっているんだと思います。

タラン
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 138
投稿日時: 2004-07-02 10:37
私がやってみたところうまく表示されましたが

...





[ メッセージ編集済み 編集者: MUSE 編集日時 2004-07-02 10:46 ]
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-07-02 11:34
引用:

多分、スクリプトレットで ServletResponse#setHeader を実行する前に
ServletResponse#getPrintWriter を実行してしまっているんだと思います。



調べ直しましたら javax.servlet.jsp.JspWriter の仕様として

引用:

一方、ページがバッファリングされる場合は、バッファがフラッシュされるまで、PrintWriter オブジェクトは作成されません。したがって、setContentType() のような操作を実行することができます。



とありますから前の記述は間違いです。
ごめんなさい。
ぴあにか
会議室デビュー日: 2004/07/01
投稿数: 5
お住まい・勤務地: 東京
投稿日時: 2004-07-02 11:43
MMXさん、顔爺さん、MUSEさん、ご返答ありがとうございます!

MMXさん>
TAB区切りにした所、うまくセルで分かれるようになりました!
ただ、お客さんから要求された仕様が「カンマ区切り」なので、
カンマ区切りで実現させたいのです。。
でも、TAB区切りにすることを提案する、というのは最終手段としたいと思います。
ありがとうございます!

顔爺さん>
ServletResponse#getPrintWriterメソッドはServlet内に見当たらなかったのですが、
ServletResponse#setHeaderする前に、PageContext#getOutしてました。
こうなっていました

コード:
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("application/download; charset=Shift_JIS");
pageContext = _jspxFactory.getPageContext(this, request, response,"", true, 0, true);

application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
    
response.setHeader("Content-Disposition", "inline; filename=\"test.csv\"");



でも、PrintWriterオブジェクトが作成されるのはバッファがフラッシュされた後ってことは、
setHeaderするタイミングは問題ないってことですよね?
(よく分かってなくってすみません。。)
PrintWriterの仕様も調べてくださって、
本当にありがとうございます!!

MUSEさん>
試してくださってありがとうございます!
環境は、
サーバ:TurboLinux+Apache+Tomcat4.0.6
クライアント:Windows2000+IE6.0
です。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-07-02 12:03
引用:

コード:
pageContext = _jspxFactory.getPageContext(this, request, response,"", true, 0, true);

(略)

response.setHeader("Content-Disposition", "inline; filename="test.csv"");



でも、PrintWriterオブジェクトが作成されるのはバッファがフラッシュされた後ってことは、
setHeaderするタイミングは問題ないってことですよね?



ただ、buffer="none" を指定した場合、バッファがないので

引用:

ページがバッファリングされない場合、この JspWriter オブジェクトへ書き出される出力は、PrintWriter へ直接書き出されます。この PrintWriter は、必要に応じて応答オブジェクトで getWriter() メソッドを呼び出して作成されます。



が該当するのかもしれません。あとは、「必要に応じて」の解釈の問題になりますが、
よくわかりません。
ぴあにか
会議室デビュー日: 2004/07/01
投稿数: 5
お住まい・勤務地: 東京
投稿日時: 2004-07-05 17:53
自己レスです。

Content-typeが間違っているのかも!と思い、
"text/x-csv; charset=Shift_JIS"や、"application/x-csv; charset=Shift_JIS"
を設定してみましたが、現象は変わりませんでした。

更に調べたところ、
「IEでは、ファイルの種類を特定するのに、Content-typeを用いるのではなく、リクエスト(HTTPリクエスト)を見てファイルの種類を特定しようとする」
という記述をいくつか見つけました。

そこで、HTTPリクエストを送る際に、それまで、

〜/TestServlet?param1=AAA¶m2=BBB....

としていた所を、

〜/TestServlet.csv?param1=AAA¶m2=BBB....

のようにURIの最後に「.csv」を付けた所、
正常にCSVデータがセルに分けられて表示されるようになりました。

今回はこれで対応してみようと思います。
1

スキルアップ/キャリアアップ(JOB@IT)