4

excelStreamExcel ファイルをダウンロードしようとしています。

私のアクションクラスでは

public class ActivityTrackerExlReportAction extends BaseAction 
{
private  InputStream excelStream;
private UserMasterDTO userMasterDTO;

public InputStream getExcelStream() 
{
 return excelStream;
}

public void setExcelStream(InputStream excelStream) {
this.excelStream = excelStream;
}

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
WorkbookSettings wbSettings = new WorkbookSettings();

try
{
  response.setHeader("Content-Disposition", "attachment; filename=/timesheet.xls");
  wbSettings.setLocale(new Locale("en", "EN"));
  WritableWorkbook workbook = Workbook.createWorkbook(outputStream, wbSettings);
  workbook.createSheet("Report", 0);
  WritableSheet excelSheet = workbook.getSheet(0);
  service.createLabel(excelSheet);
  service.createContent(excelSheet);  

  workbook.write();

  ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

  setExcelStream(inputStream);

  workbook.close();

  outStream.flush();

  outStream.close();
}
catch(Exception e)
{
}
finally
{
// outStream.close();
 }
 return "generateReport
}

私のstruts.xml内容:

<result type="stream" name="generateReport">
 <param name="contentType">"application/vnd.ms-excel"</param>
 <param name="inputName">excelStream</param>
 <param name="bufferSize">1024</param>
</result>

JXLExcelシートの作成と書き込みに使用しています。エラーが発生する理由と、エラーから抜け出す方法を教えてください。呼び出しスタックにjava.io.InputStreamその名前の が見つかりません[excelStream]

私はスタックトレースです:

java.lang.IllegalArgumentException: 呼び出しスタックに [excelStream] という名前の java.io.InputStream が見つかりません。このアクションに指定されたタグを確認してください。

org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237)

org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) .......

4

2 に答える 2

3

編集

新しく投稿されたコードでは、次の 2 つの「悪い」ことを行っています。

1) あなたは例外を飲み込んでいます。それは本当に間違っています。

置く

e.printStackTrace();

あなたの中に

catch(Exception e){}

ブロックすると、おそらくスローされ、キャッチされ、表示されない例外が表示されます。

2) Exception が発生した場合でも、同じ結果が返されます(つまり、99.9% 発生しています)。これにより、Struts2 Stream の結果が、(例外のため) 初期化されていない excelStream 変数に到達しようとします。

エラーが発生した場合は、ストリームの結果タイプではなく、エラーを示す JSP とともに、グローバル (またはローカル) エラーの結果タイプを返す必要があります。

例外を出力し、コードを修正すると、すべてがうまくいきます:)

PS: レスポンスに直接書き込むことは避けてください。Stream の結果タイプの contentDisposition を使用してください。


エラーは

 <param name="inputName">excelstream</param>

する必要があります

 <param name="inputName">excelStream</param>

常に camelCase を使用します (アクションで行ったように、struts 構成では使用しません)。

そして明らかに contentDisposition を削除するか、次のように適切な値を設定する必要があります

 <param name="contentDisposition">attachment; filename="myExcel.xls"</param>
于 2012-12-28T11:55:08.600 に答える