struts2+jxl导出excel无法下载

jackpay 2013-01-05 04:11:08
struts2配置:

<action name="exportExcel" class="exportExcel">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param><!-- 下载文件类型 -->
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param><!-- 下载文件名 -->
<param name="bufferSize">1024</param>
</result>
</action>

action:


public class ExportExcel extends BaseAction {
....
private InputStream inputStream;
private String filename;

getter&setter.....

public String exportExecl() {
response.reset();
response.setContentType("application/vn.ms-excel");
response.setCharacterEncoding("utf-8");

ByteArrayOutputStream os = new ByteArrayOutputStream();
os.reset();
try {
WritableWorkbook book = Workbook.createWorkbook(os);
WritableSheet sheet = book.createSheet("第一页", 0);
int num = title.split(",").length;
for (int i = 0; i < num; i++) {
sheet.addCell(new Label(i, 0, title.split(",")[i]));
}
int xNumber = 1; // 定义循环的行的编号变量随for循环自动循环
List l = null;
l = tjService.query(sql);
if (l != null && l.size() > 0) {
System.out.println("size" + l.size());
String v[] = val.split(",");
for (int i = 0; i < l.size(); i++) {
clsObj = l.get(i);
for (int j = 0; j < v.length; j++) {
String methodname = "get" + v[j].substring(0, 1).toUpperCase() + v[j].substring(1);
Method method = clsObj.getClass().getMethod(methodname, new Class[] {});
Object o = method.invoke(clsObj, new Class[] {});
if (o == null) {
sheet.addCell(new Label(j, xNumber, ""));
} else {
sheet.addCell(new Label(j, xNumber, o.toString()));
}
}
++xNumber;
}
}
book.write();
book.close();
this.filename = new Date().toString() + ".xls";

this.inputStream = new ByteArrayInputStream(os.toByteArray());
} catch (Exception e) {
System.out.println("excel表格创建或写入错误,错误信息如下");
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}

}


action没有报错,就是页面不提示下载,显示乱码,头都大了,另一个页面同样配置都可以正常导出
情况如下图:
...全文
471 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
小卒过河0104 2014-10-23
  • 打赏
  • 举报
回复
public String getFileName() throws UnsupportedEncodingException { fileName = new String(fileName.getBytes(), "ISO-8859-1"); return fileName; }
JoeyLin1990 2013-06-03
  • 打赏
  • 举报
回复
我和楼主遇到一样的问题了,我解决办法是由原来的post异步访问后台的导出方法修改为get方式就没问题了
卡加林 2013-04-22
  • 打赏
  • 举报
回复
请问楼主解决了没有
dracularking 2013-01-07
  • 打赏
  • 举报
回复
book.write(); book.close(); this.filename = new Date().toString() + ".xls"; this.inputStream = new ByteArrayInputStream(os.toByteArray()); 这段代码看上去不太像是将excel发送到前台的,os和book是怎么关联的,os又是怎么发送到前台的 可以先把业务逻辑放在servlet里测一下
jackpay 2013-01-06
  • 打赏
  • 举报
回复
试了下,还是不行
莫忘 2013-01-06
  • 打赏
  • 举报
回复

response.setContentType("application/vnd.ms-excel;charset=utf-8");
		response.setHeader("Content-Disposition", "attachment;filename="
				+ new String(fileName.getBytes("gbk"), "ISO8859-1")	+
				new String("导出".getBytes("gbk"), "ISO8859-1")
				+ ".xls");
OutputStream out = response.getOutputStream();
WritableWorkbook workbook = Workbook.createWorkbook(out);
……………………
workbook.write();
out.flush();
上面是Struts1的写法
suciver 2013-01-06
  • 打赏
  • 举报
回复
<param name="contentType">application/application/vnd.ms-excel</param> 这个改成excel的mimeType再把filename用个简单点的a.xls先试下能下载不
上帝的无名指 2013-01-06
  • 打赏
  • 举报
回复
HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/x-msdownload"); response.setHeader("Content-disposition", "attachment;filename=" + new String(paramfile.getName().getBytes("gb2312"), "iso8859-1")); os = response.getOutputStream(); book = Workbook.createWorkbook(os); return null; 最后配置文件 <action name="XXX" class="XXXXX" method="XXX"> </action>
jackpay 2013-01-06
  • 打赏
  • 举报
回复
引用 16 楼 cycao313 的回复:
引用 15 楼 jackpay 的回复:试了下,还是不行楼主页面上怎么写的?
就一个按钮,请求这个action所有查询sql都是在action拼接出来的
jackpay 2013-01-06
  • 打赏
  • 举报
回复
不要沉了啊。。。。。。。
莫忘 2013-01-06
  • 打赏
  • 举报
回复
引用 15 楼 jackpay 的回复:
试了下,还是不行
楼主页面上怎么写的?
jackpay 2013-01-05
  • 打赏
  • 举报
回复
引用 9 楼 cycao313 的回复:
Java code?1this.filename = new Date().toString() + ".xls"; 难道文件名的问题?猜测
也不是,这个也试过了
莫忘 2013-01-05
  • 打赏
  • 举报
回复
this.filename = new Date().toString() + ".xls";
难道文件名的问题?猜测
jackpay 2013-01-05
  • 打赏
  • 举报
回复
引用 7 楼 suciver 的回复:
getInputStream()方法有了吗
都有了
suciver 2013-01-05
  • 打赏
  • 举报
回复
getInputStream()方法有了吗
jackpay 2013-01-05
  • 打赏
  • 举报
回复
引用 3 楼 hzw2312 的回复:
人品!!!
jackpay 2013-01-05
  • 打赏
  • 举报
回复
引用 2 楼 jianqiangking 的回复:
先要排除Excel有没有生成,或者你配置里面出现了重复转向, 页面弹出下载代码贴出来看看
excel直接写到硬盘没问题,向前台传的时候不行,struts2配置下载在前台不用写弹出代码,配置了<param name="contentDisposition">attachment;filename="${filename}"</param><!-- 下载文件名 --> 就好了
jackpay 2013-01-05
  • 打赏
  • 举报
回复
引用 1 楼 suciver 的回复:
action的method少了指定下<action name="exportExcel" class="exportExcel" method="exportExcel">
我在请求的时候用的是exportExcel!exportExecl.action
BUG胡汉三 2013-01-05
  • 打赏
  • 举报
回复
人品!!!
熊猫大虾 2013-01-05
  • 打赏
  • 举报
回复
先要排除Excel有没有生成,或者你配置里面出现了重复转向, 页面弹出下载代码贴出来看看
加载更多回复(1)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧