4

excelStream我正在尝试下载一个 excel 文件。

在我的行动课上

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>

我正在使用JXL创建和编写 Excel 工作表。为什么我会收到错误以及如何摆脱它?在调用堆栈中找不到java.io.InputStream具有该名称的[excelStream]

我的是 Stacktraces:

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

编辑

在新发布的代码中,您正在做两件“坏”的事情:

1)您正在吞食异常,这确实是错误的;

放一个

e.printStackTrace();

在你的里面

catch(Exception e){}

块,您将看到可能被抛出、捕获且未显示的异常;

2)即使你得到一个 Exception,你也会返回相同的结果,(那是 99.9% 发生了什么);这将导致 Struts2 Stream 结果尝试访问从未初始化的 excelStream 变量(由于异常)。

如果出现错误,您应该返回一个全局(或本地)错误结果类型,并带有一个显示错误的 JSP,而不是一个 Stream 结果类型。

打印异常,更正代码,然后一切都会好起来的:)

PS:请避免直接写在响应中,使用 Stream 结果类型中的 contentDisposition。


错误是

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

应该

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

始终使用 camelCase(就像您在 Action 中所做的那样,但不是在 struts 配置中所做的那样)。

显然 contentDisposition 应该被删除,或者设置一个适当的值,比如

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

您遇到此问题的原因是:

struts2要获取inputstream时,会调用getExcelStream()方法获取流,但是返回的InputStream为null。

解决方法是:打开文件并在getExcelStream()中返回一个新的InputStream

于 2015-05-11T03:12:09.087 回答