日期:2014-05-17  浏览次数:20759 次

关于poi导出Excel的问题。
现在在做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页面,后台执行了,但是没有弹出下载框,请问哪里出现问题了?
poi

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

------解决方案--------------------
引用:
Quote: 引用:

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

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

那么页面就不会跳转,而是直接返回一个execl报表。
如果想既跳转并且返回execl报表的话可以尝试两次请求。
我记得当初我错误的原因是生成一个out流,这个流与jsp自身的输出流冲突。
你先看看是不是这个原因,先找我说的试试,如果能返回execl表了再说。
------解决方案--------------------
你是怎么确定成功跳转到这个页面的,你弹出框是怎么写的,有js错误吗?
------解决方案--------------------
我你这是struts2的问题 不是poi的问题
------解决方案--------------------
class="measureAction" 这个是不是要写包全名啊
------解决方案--------------------
POI生成excel弹出框是response出来的,那么你的struts不需要做任何的跳转
------解决方案--------------------
数据写完,记得关闭输出流,不然页面不会有反应
------解决方案--------------------
response.setHeader("Content-Disposition","attachment;filename=exportdata.xls");     response.setContentType("application/vnd.ms-excel"); 
这两句应该写到你的action的方法里