- PR -

Excelダウンロードでグラフ・罫線が表示されない

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/02/24
投稿数: 55
投稿日時: 2005-08-26 11:16
以下のコードにてExcelファイルをダウンロードする処理を行ってます。
ところがダウンロードはできるのですが、ファイルを開こうとすると
エラーメッセージが表示されます。
エラーを無視してファイルを開くこともできますが、
そうすると罫線やグラフのデータが表示されません。
どうか助けてください。


コード:

public void execute(
HttpServletRequest request,
HttpServletResponse response)
throws Exception {


File file = new File(excelPath+"graph.xls");
String filename = "attachment;filename=" + file.getName();
response.setHeader("Content-Disposition", filename);
response.setContentType("application/vnd.ms-excel");
OutputStream out = null;
FileInputStream fin = null;
try {
fin = new FileInputStream(file);
BufferedInputStream bin = new BufferedInputStream(fin);


out = response.getOutputStream();
BufferedOutputStream bout = new BufferedOutputStream(out);

int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}


} catch (IOException e) {
throw e;
} finally {
if (fin != null) {
fin.close();
}
if (out != null) {
out.flush();
out.close();
}
}
}





【Excelファイルを開こうとしたときのエラーメッセージ】
'graph.xls' にアクセスできません。ファイルは読み取り専用であるか、または読み取り専用の場所にアクセスしようとしています。または、サーバー上に保存されているドキュメントから応答がありません。

【キャンセルボタンを押下してファイルを開いたときのメッセージ】
'graph.xls'にエラーが検出されましたがMicrosoft Excelは次の修復を行うことによってファイルを開くことができました。修復を保持するにはこのファイルを保存してください。
修復の一覧:
ファイルへのダメージが深刻であり修復は不可能です。Microsoft Excel は数式と値の回復を試みましたが、消失または破損したデータが含まれる可能性があります。



【環境】
Tomcat 4.1
JDK 1.4
IE 6.0
Excel 2002

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-26 11:18 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-08-26 11:35
BufferedOutputStream を閉じる前にサーブレットのOutputStream をクローズしているためにバッファされてる最後の部分が送信されていないのではないでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-08-26 12:47
そもそもレスポンスの出力ストリームはサーブレット内でクローズするものではありませんよ。
takashi
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 79
お住まい・勤務地: 東京
投稿日時: 2005-08-26 12:54
こんにちは。

少し気になったのですが、
コード:
 } finally {
  if (fin != null) {
   fin.close();
  }
  if (out != null) {
   out.flush();
   out.close();
  }
 }


ここでクローズするべきは, 一番外側でラップしてるクラス(ここではbinとbout)ではなかったでしょうか?
間違ってたらごめんなさい。
未記入
ベテラン
会議室デビュー日: 2005/02/24
投稿数: 55
投稿日時: 2005-08-26 13:18
直りました。
ご指摘のとおりoutをclose()していたのが悪かったようです。
そもそもout.flush()はbout.flush()じゃないといけませんよね。
以上を直してうまく動きました。

どうもありがとうございました。

1

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