3

CSV 出力を認識して Excel で開く際に問題が発生しました。私の Web アプリケーションには、検索結果をユーザーに返す Java サーブレットがあります。検索結果は、Apache Solr サーバーによって配信されます。ユーザーが「CSV」形式で検索結果を要求できるようにする GUI フロントエンドのオプションがあります。このオプションを選択すると、「wt=csv」パラメーターを追加して、Solr に対してクエリが再実行されます。次に、Java フィルターがヘッダーを追加して、結果を CSV 形式のテキストとして返します。しかし、それは正しく機能していません。

  • IE (ver 8.0) では、ファイルを「開く」または「保存」するよう求められます。「開く」を選択した場合。Excel で開くのではなく、CSV 形式のテキストを画面に表示するだけです。「保存」を選択すると、エラー メッセージが表示されます – 「このインターネット サイトを開けません。リクエストされたサイトは利用できないか、見つかりません。」</li>
  • Firefox (ver 10.0.9) でも同様です。ファイルを開くか保存するように求められます。ただし、CSV ファイルを開く場合。デフォルトのオプションはメモ帳で、Excel はリストされていません。[保存] をクリックすると、CSV ファイルがダウンロードされ、Excel で開くことができ、Excel で正しく認識されます。

さまざまなヘッダーと組み合わせを試しました –</p>

  //((HttpServletResponse)response).setHeader("Content-Type", "application/octet; charset=utf-8");
  ((HttpServletResponse)response).setHeader("Content-Type", "text/csv");
  //((HttpServletResponse)response).setHeader("Content-Type", "application/vnd.ms-excel");
  //((HttpServletResponse)response).setHeader("Cache-Control", "private, private,max-age=0,must-revalidate");
  //((HttpServletResponse)response).setHeader("Content-Encoding", "gzip");
  //((HttpServletResponse)response).setHeader("Content-Encoding", "binary");
  ((HttpServletResponse)response).setHeader("Content-Disposition", "attachment; filename=Download.CSV");
  //((HttpServletResponse)response).setHeader("Content-Disposition", "inline; filename=Download.CSV;");

しかし、それらのどれも機能していないようです。Firefox を使用して、送り返されているヘッダーを調べたところ、次のように表示されました –</p>

Content-Disposition:添付ファイル; ファイル名=Download.C​​SV

Content-Type:text/plain;charset=UTF-8

サーバー:Jetty(7.xy-SNAPSHOT)

Transfer-Encoding:チャンク

Vary:Accept エンコーディング

content-type は csv または Excel として指定されていますが、ブラウザに到達すると、テキスト/プレーンとして解釈され、それが問題だと思います。どのヘッダーまたはエンコーディングを設定すればよいかわかりませんか? 助言がありますか?ありがとう。

4

1 に答える 1

1

私は似たようなことをしていますが、これは私が使用しているコードの一部です:

    Date dt = new Date();
    SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd_HHmmss");
    String filename = fmt.format(dt) + ".csv";
    //Setup the output
    String contentType = "application/vnd.ms-excel";
    FacesContext fc = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse)fc.getExternalContext().getResponse();
    response.setHeader("Content-disposition","attachment; filename=" + filename);
    response.setContentType(contentType);

変数「contentType」を使用して、生成されるファイルの種類をサーブレットに伝えていることに注意してください。

それがうまくいくことを願っています。

于 2013-03-04T19:27:46.233 に答える