excel导出(使用window.open的post请求方式)

   最近在做一个导出excel的功能,本来这个功能很简单,之前也做过没必要写,但是在做的时候发现一个问题,那就是传参参数过长的问题,听我细细道来。

   按理说导出是后台java做的事情,但是我这次是将前台的表格数据拼成json然后当做参数传到后台,具体方式是使用url将参数放到url中,那么问题来了,假如前台表格中的数据很多时,是用这种方式肯定会有问题,因为window.open 默认是使用get请求的方式来发送,我们知道get请求时,参数长度是有限制的,那么我们就得需要使用post的方式将参数传递过去。

  下面我把前端 的代码粘贴出来:

//monitorSplashesExport 点击事件
        $("#monitorSplashesExport").click(function(){
            var tableData = "";//表格数据中间用@@@隔开
            var trList = $(".dataTables_scrollBody").find("table").find("thead").find("tr").children("th");
            var theadArray = new Array();
            for(var i=0; i

先把数据封装起来,形成theadArray和 tableData 再调用 doExport(theadArray, tableData) 方法。

下面把window.open 封装成 post方式

//将window.open修改为post请求方式
        function doExport(theadArray, tableData){
            var url = "${ctx}/instantMeasure.do?formAction=doExportExcel";
            var tempForm = $("
"); tempForm.attr("id", "tempForm1"); tempForm.attr("style", "display:none"); tempForm.attr("target", name); tempForm.attr("method", "post"); tempForm.attr("action", url); var input1 = $(""); input1.attr("type", "hidden"); input1.attr("name", "theadArray"); input1.attr("value", theadArray);//表头数据 var input2 = $(""); input2.attr("type", "hidden"); input2.attr("name", "tableData"); input2.attr("value", tableData);//表格内容数据 tempForm.append(input1); tempForm.append(input2); tempForm.on("submit", function(){openWindow(name);}); // 必须用name不能只用url,否则无法传值到新页面 tempForm.trigger("submit"); $("body").append(tempForm);//将表单放置在web中 tempForm.submit(); $("tempForm1").remove(); } function openWindow(name) { window.open(name, "_self"); }

然后后端java代码如下:

else if("doExportExcel".equals(action)){
			OutputStream os = null;
			WritableWorkbook wbook = null;
			try{
				String theadArray = request.getParameter("theadArray");
				String[] tHead = theadArray.split(",");
				String tableData = request.getParameter("tableData");
				String[] tBody = tableData.split("@@@");

				os = response.getOutputStream();// 取得输出流
				response.reset();// 清空输出流
				response.setHeader("Content-disposition", "attachment; filename=testRed.xls");// 设定输出文件头
				response.setContentType("application/msexcel");// 定义输出类型

				wbook = Workbook.createWorkbook(os); // 建立excel文件
				String tmptitle = "散点详情"; // 标题
				WritableSheet wsheet = wbook.createSheet(tmptitle, 0); // sheet名称

				// 设置excel标题
				WritableFont wfont = new WritableFont(WritableFont.ARIAL, 16, WritableFont.BOLD, false,
						UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
				WritableCellFormat wcfFC = new WritableCellFormat(wfont);
				wcfFC.setBackground(Colour.AQUA);
				wsheet.addCell(new Label(1, 0, tmptitle, wcfFC));
				wfont = new jxl.write.WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false,
						UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
				wcfFC = new WritableCellFormat(wfont);

				int count = 0;//
				// 开始生成主体内容
				//表头从第二行开始
				//表头
				for(int i=0; i

不积跬步无以至千里

不积小流无以成江海

你可能感兴趣的:(java学习,前端)