在struts2框架下用ajax将数据写到Excel中并下载的实现方法
一般我们都认为要想实现将数据写到Excel并下载,通过ajax方法是不行的,我们常用的方法是通过form表单,将要写入的数据包含在form表单中,然后通过form表单的提交来将数据写入Excel中并下载的功能。
通常ajax是通过异步提交是不能实现将数据写入到Excel中并下载的,但我们可以通过一个小技巧----首先通过ajax将要写入Excel文件的数据传到后台,后台对数据进行处理,并通过jxl将数据写入到Excel表格中,然后先将表格保存在指定的路径中,并返回个flag(指示写入到Excel的操作是否成功),根据后台返回的flag的值,对flag进行判断后,我们可以用window.location.href=“downLoadExcel.action”来实现文件的下载功能!【一步不行,我们走两步!成功曲线救国】
下面废话不多说,来点干货:
首先是前端ajax代码:
$.ajax({
url : '${pageContext.request.contextPath}/home_exportToExcel.action',
dataType : "json",
data: sendData,
async : false,
type : "POST",
success : function(ret) {
var data = eval('(' + ret + ')');
if(data.response == "success") {
window.location.href = "downLoadExcel.action";
} else {
swal("","报表导出失败,请联系管理员","warning");
}
},
error : function() {
swal("","操作失败","warning");
}
});
sendData为自己封装的传入的数据,各位看官可自行定义。
用jxl对数据进行处理并写入到Excel文件中,度娘有很多这种文档,我就不多说了,自行处理。
下面我贴出struts的配置文件,很重要!!!
<action name="downLoadExcel" method="downloadingExcel" class="com.cn.home.IndexAction">
<result name="success" type="stream">
<param name="contentType">application/x-download</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"
</param>
<param name="bufferSize">1024</param>
<!--action中必须有excelStream的属性及set、get方法 -->
<param name="inputName">excelStream</param>
</result>
</action>
其中的name = “downLoadExcel“是与ajax中url中对应的方法名,method是IndexAction中的方法,也就是这个处理的主函数
接着刺激的部分来了,实现下载文件的主要代码如下:
private String downloadFileName;//下载文件的名称
private InputStream excelStream;//excelStream
// downloadFileName的set/get
public void setDownloadFileName(String downloadFileName) {
this.downloadFileName = downloadFileName;
}
public String getDownloadFileName() {
//给下载的文件设置默认名
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd_HHmmss ");
downloadFileName = "下载文件_" + (sf.format(new Date()).toString())+ ".xls";
try {
//中文处理
downloadFileName = new String(downloadFileName.getBytes(),"ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downloadFileName;
}
public String downloadingExcel(){
HttpServletRequest request = ServletActionContext.getRequest();
String filename = (String) request.getSession().getAttribute("filename"); //获取生成的Excel文件的位置(在前一个步骤生成的Excel的路径,用session封装到filename中
即 前一个步骤有此代码:request.getsession().setAttribute("filename",fileName) //其中的fileName为生成的Excel文件默认在计算机中保存的位置
)
try {
//将前一个步骤中生成的Excel文件编程文件流提供下载
excelStream = new FileInputStream(new File(filename));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SUCCESS;
}
// excelStream的set/get
public InputStream getExcelStream() {
return excelStream;
}
public void setExcelStream(InputStream excelStream) {
this.excelStream = excelStream;
}
到此,我们成功的通过一个小技巧,实现了利用ajax传数据导后台,将数据写入到Excel并下载到计算机的功能!
end!!!
注:有问题可以在评论席联系博主!