实现导出功能,多数人都会选择一些热门的框架来完成。这样做无可厚非。但有些时候,只为一些简单的导出引入一个框架来说有点儿用牛刀杀鸡的感觉。java.io本事自带的导入导出功能就能够解决这些简单的问题。而且,导出框架也都是基于java.io进行的扩展。
下面简单介绍下将页面内容用java.io自带的功能实现导出。
要导出的页面内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base target="download"/>
<title>
<s:property value="#request.title"/>
</title>
<jsp:include page="../common/meta.jsp"/>
<STYLE type="text/css">
</STYLE>
<script type="text/javascript">
$(function(){
$('#expinfo').val($('#s_info').html());
});
//打印2
function printInfo(){
//打印时将头尾两部分隐藏
$('#header_div').css('display','none');
window.print();
$('#header_div').css('display','block');
}
</script>
</head>
<body>
<div id="header_div">
<form name="expform" id="expform" method="post" action="${root}/jxEval/rwexp.action">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr style="height:30px">
<td width="6%">
<textarea name="expinfo" id="expinfo" style="display: none;" ></textarea>
<!-- 导出文件名,根据导出的文件名称后缀判断导出文件类型 -->
<input type="hidden" name="fileName" id="fileName" value="<s:property value="#request.title"/>.doc">
</td>
<td align="right">
<input type="submit" class="btn" value="导出" title="导出Word" style="width:60px"/>
<input type="button" class="btn" value="打印" title="打印" style="width:60px" onclick="printInfo()"/>
</td>
</tr>
</table>
</form>
</div>
<div id="s_info">
//添加导出内容部分
</div>
<iframe id="download" name="download" height="0px" width="0px"></iframe>
</body>
</html>
这里,为了防止在导出时弹出一个页面,对页面做了如下处理:
1、在head中添加base标签
<base target="download"/>
2、在body中添加一个iframe
<iframe id="download" name="download" height="0px" width="0px"></iframe>
后台Action
private String fileName;//文件名
public String getFileName()throws Exception {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String execute() throws Exception {
String expinfo=request.getParameter("expinfo");
if(!ValidateUtil.validateString(expinfo)){
return null;
}
HttpServletResponse resp = ServletActionContext.getResponse();
resp.reset();
resp.setContentType("application/vnd.ms-word;charset=UTF-8");
String strFileName = FileUtil.getFilePrefix(fileName);
strFileName = URLEncoder.encode(strFileName, "UTF-8");
String guessCharset = "gb2312";
strFileName = new String(strFileName.getBytes(guessCharset), "ISO8859-1");
resp.setHeader("Content-Disposition", "attachment;filename=" + strFileName + ".doc");
OutputStream os = resp.getOutputStream();
os.write(expinfo.getBytes(), 0, expinfo.getBytes().length);
os.flush();
os.close();
return null;
}
注意:
1、要对文件名进行编码,否则可能会出现无法导出。
2、在对outputstream执行write操作时,第三个参数请务必保持和第一个参数一致,否则可能会出现导出内容缺失的情况。
即写成
os.write(expinfo.getBytes(), 0, expinfo.getBytes().length);
而非
os.write(expinfo.getBytes(), 0, expinfo.length());
原因很简单,你懂得。
对应struts.xml文件配置
<action name="rwexp" class="com.xxx.action.RwexpAction"></action>
由于action的方法中无需返回值,这里也就无需多做配置了。