我正在尝试下载一个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).......
2条答案
按热度按时间4xy9mtcn1#
编辑
在新发布的代码中,您正在做两件“不好”的事情:
1)你正在吞下一个异常,那真的真的错了;
把一个
在你的
块中,您将看到可能被抛出、捕获但未显示的Exception;
2)即使你得到一个Exception,你也会返回相同的结果(这是99.9%发生的事情);这将导致Struts2 Stream结果试图到达从未初始化的excelStream变量(由于异常)。
如果出现错误,您应该返回一个全局(或局部)错误结果类型,并使用一个JSP来显示错误,而不是返回一个Stream结果类型。
打印异常,更正代码,然后一切都会好起来的:)
P.S:请避免直接在响应中写入,使用来自Stream结果类型的contentDisposition。
错误是
应该是
始终使用camelCase(就像在Action中所做的那样,而不是在struts配置中)。
显然,contentDisposition应该被删除,或者设置一个合适的值,比如
axr492tv2#
您遇到此问题的原因是:
当struts2想要获取inputstream时,它会调用getExcelStream()方法来获取流,但返回的InputStream为null。
解决方案是:打开文件并在getExcelStream()中返回一个新的InputStream