关于poi导出Excel的问题。

时间:2022-12-30 09:27:04
现在在做Excel的导出功能,我看了网上的论坛,都是用poi和jxl做的,综合比较了一下选择了poi,但是在导出demo这一块,我直接访问页面可以弹出下载框,如果结果struts2的返回跳转到该页面,则没有任何反应,有些小晕,请高手指点错误出在哪里。现在贴出代码:



<%@ page language="java" import="java.util.*"  pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="application/vnd.ms-excel" language="java" 
import="java.util.*,com.Export"%>
<%
response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");
response.setContentType("application/vnd.ms-excel");
Export  ex = new Export(); 
 ex.buildStudentExcel("exportdata.xls",response.getOutputStream());
%>
<%
out.clear();
out=pageContext.pushBody();
%>


上面的是jsp中的代码,直接访问能弹出下载框



<action name="expExcel" class="measureAction" method="expExcel" >
  <result name="success" >/auditcheck/measure/123.jsp</result>
</action>

这是struts2中的配置,请求成功后跳到上面的jsp页面,后台执行了,但是没有弹出下载框,请问哪里出现问题了?

19 个解决方案

#1


#2


我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

#3


推荐pageoffice 很强大的一款插件,轻松实现office编辑打印导出

#4


有道理,学习了,那JSP要怎么处理

#5


引用 2 楼 AA5279AA 的回复:
我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

#6


引用 5 楼 lijibo503 的回复:
Quote: 引用 2 楼 AA5279AA 的回复:

我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。

#7


你是怎么确定成功跳转到这个页面的,你弹出框是怎么写的,有js错误吗?

#8


我你这是struts2的问题 不是poi的问题

#9


class="measureAction" 这个是不是要写包全名啊

#10


引用 9 楼 cheng417905 的回复:
class="measureAction" 这个是不是要写包全名啊

是写数据那个方法走了,所以我肯定是跳转成功了,而且数据肯定也写进了excel,这我打断点跟过了,只不过执行完写数据就没反应了,没有弹出保存框。

#11


引用 7 楼 cheng417905 的回复:
你是怎么确定成功跳转到这个页面的,你弹出框是怎么写的,有js错误吗?

后台没报错误,也没有js错误。

#12


引用 6 楼 AA5279AA 的回复:
Quote: 引用 5 楼 lijibo503 的回复:

Quote: 引用 2 楼 AA5279AA 的回复:

我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。



我的做法:
1:先经过一个action去数据库中查到了要导出的数据。把数据封装到session中
2:action执行成功后,通过struts2跳到一个jsp页面,在该页面获取session中的数据。设置头信息。
调用写入数据到excel文件的方法。

现在的结果是:写数据到excel的方法走了(我打断点跟了),但是前台页面没有弹出保存框,所以我也不知道这数据写哪里去了。

#13


POI生成excel弹出框是response出来的,那么你的struts不需要做任何的跳转

#14


数据写完,记得关闭输出流,不然页面不会有反应

#15


引用 14 楼 nicholasbobo 的回复:
数据写完,记得关闭输出流,不然页面不会有反应





try {
out.flush();
wb.write(out);
out.close();

} catch (IOException e) {
e.printStackTrace();
System.out.println("Out  is  closed ");
}


已经关流了

#16


response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里

#17


引用 16 楼 nicholasbobo 的回复:
response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里

不是这个原因。

#18


引用 6 楼 AA5279AA 的回复:
Quote: 引用 5 楼 lijibo503 的回复:

Quote: 引用 2 楼 AA5279AA 的回复:

我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。





谢谢各位哈,现将解决办法粘出来跟大家分享一下:
struts配置改成了如下配置:


<!-- 导出excel -->
         <action name="expExcel" class="measureAction" method="ExcelExport" >
<result name="excel" type="stream">
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
    <param name="inputName">excelFile</param>
</result>


遇到的问题:
jsp页面原来一直弹不出保存框,排除了各种原因,最后发现了,在执行这个请求的时候,不能用ajax请求,即$.post(uri),这种就是出不来,同样的代码,jsp用form表单请求和<a href="">a标签请求都能出来,具体原因我也说不清楚,问题就出在这里了

#19


引用 16 楼 nicholasbobo 的回复:
response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里

谢谢各位哈,现将解决办法粘出来跟大家分享一下:
struts配置改成了如下配置:


<!-- 导出excel -->
         <action name="expExcel" class="measureAction" method="ExcelExport" >
<result name="excel" type="stream">
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
    <param name="inputName">excelFile</param>
</result>


遇到的问题:
jsp页面原来一直弹不出保存框,排除了各种原因,最后发现了,在执行这个请求的时候,不能用ajax请求,即$.post(uri),这种就是出不来,同样的代码,jsp用form表单请求和<a href="">a标签请求都能出来,具体原因我也说不清楚,问题就出在这里了

#1


#2


我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

#3


推荐pageoffice 很强大的一款插件,轻松实现office编辑打印导出

#4


有道理,学习了,那JSP要怎么处理

#5


引用 2 楼 AA5279AA 的回复:
我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

#6


引用 5 楼 lijibo503 的回复:
Quote: 引用 2 楼 AA5279AA 的回复:

我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。

#7


你是怎么确定成功跳转到这个页面的,你弹出框是怎么写的,有js错误吗?

#8


我你这是struts2的问题 不是poi的问题

#9


class="measureAction" 这个是不是要写包全名啊

#10


引用 9 楼 cheng417905 的回复:
class="measureAction" 这个是不是要写包全名啊

是写数据那个方法走了,所以我肯定是跳转成功了,而且数据肯定也写进了excel,这我打断点跟过了,只不过执行完写数据就没反应了,没有弹出保存框。

#11


引用 7 楼 cheng417905 的回复:
你是怎么确定成功跳转到这个页面的,你弹出框是怎么写的,有js错误吗?

后台没报错误,也没有js错误。

#12


引用 6 楼 AA5279AA 的回复:
Quote: 引用 5 楼 lijibo503 的回复:

Quote: 引用 2 楼 AA5279AA 的回复:

我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。



我的做法:
1:先经过一个action去数据库中查到了要导出的数据。把数据封装到session中
2:action执行成功后,通过struts2跳到一个jsp页面,在该页面获取session中的数据。设置头信息。
调用写入数据到excel文件的方法。

现在的结果是:写数据到excel的方法走了(我打断点跟了),但是前台页面没有弹出保存框,所以我也不知道这数据写哪里去了。

#13


POI生成excel弹出框是response出来的,那么你的struts不需要做任何的跳转

#14


数据写完,记得关闭输出流,不然页面不会有反应

#15


引用 14 楼 nicholasbobo 的回复:
数据写完,记得关闭输出流,不然页面不会有反应





try {
out.flush();
wb.write(out);
out.close();

} catch (IOException e) {
e.printStackTrace();
System.out.println("Out  is  closed ");
}


已经关流了

#16


response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里

#17


引用 16 楼 nicholasbobo 的回复:
response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里

不是这个原因。

#18


引用 6 楼 AA5279AA 的回复:
Quote: 引用 5 楼 lijibo503 的回复:

Quote: 引用 2 楼 AA5279AA 的回复:

我记得以前遇到一个算是类似的问题吧,如果这个改成action的话,
直接往返回流中写execl数据并且还有返回值的话,会出现一个异常-流冲突,
如果把返回值修改为null,就能正常返回execl表了。

不太明白,请问是把action中的返回值改为null嘛?如果action中的返回值改为null,struts2怎么知道要跳转到哪个页面呢?

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。





谢谢各位哈,现将解决办法粘出来跟大家分享一下:
struts配置改成了如下配置:


<!-- 导出excel -->
         <action name="expExcel" class="measureAction" method="ExcelExport" >
<result name="excel" type="stream">
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
    <param name="inputName">excelFile</param>
</result>


遇到的问题:
jsp页面原来一直弹不出保存框,排除了各种原因,最后发现了,在执行这个请求的时候,不能用ajax请求,即$.post(uri),这种就是出不来,同样的代码,jsp用form表单请求和<a href="">a标签请求都能出来,具体原因我也说不清楚,问题就出在这里了

#19


引用 16 楼 nicholasbobo 的回复:
response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里

谢谢各位哈,现将解决办法粘出来跟大家分享一下:
struts配置改成了如下配置:


<!-- 导出excel -->
         <action name="expExcel" class="measureAction" method="ExcelExport" >
<result name="excel" type="stream">
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
    <param name="inputName">excelFile</param>
</result>


遇到的问题:
jsp页面原来一直弹不出保存框,排除了各种原因,最后发现了,在执行这个请求的时候,不能用ajax请求,即$.post(uri),这种就是出不来,同样的代码,jsp用form表单请求和<a href="">a标签请求都能出来,具体原因我也说不清楚,问题就出在这里了

#20