struts2通过一个小技巧实现通过ajax来生成Excel表格并下载

            在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!!!

注:有问题可以在评论席联系博主!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值