JSP struts2在调用堆栈中找不到名为[excelStream]的java.io.InputStream

i5desfxk  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(206)

我正在尝试下载一个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工作表。为什么我会得到错误,如何摆脱它?在调用堆栈中找不到名为[excelStream]java.io.InputStream
我是Stacktrace:
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).......

4xy9mtcn

4xy9mtcn1#

编辑

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

1)你正在吞下一个异常,那真的真的错了;

把一个

e.printStackTrace();

在你的

catch(Exception e){}

块中,您将看到可能被抛出、捕获但未显示的Exception;

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

如果出现错误,您应该返回一个全局(或局部)错误结果类型,并使用一个JSP来显示错误,而不是返回一个Stream结果类型。
打印异常,更正代码,然后一切都会好起来的:)
P.S:请避免直接在响应中写入,使用来自Stream结果类型的contentDisposition。
错误是

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

应该是

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

始终使用camelCase(就像在Action中所做的那样,而不是在struts配置中)。
显然,contentDisposition应该被删除,或者设置一个合适的值,比如

<param name="contentDisposition">attachment; filename="myExcel.xls"</param>
axr492tv

axr492tv2#

您遇到此问题的原因是:
当struts2想要获取inputstream时,它会调用getExcelStream()方法来获取流,但返回的InputStream为null。
解决方案是:打开文件并在getExcelStream()中返回一个新的InputStream

相关问题