maven项目中打印和导出(表格)功能实现

本文介绍了如何在Java Maven项目中实现在jsp页面中通过JavaScript函数实现表格的打印和导出Excel功能。通过jQuery发送POST请求获取数据,然后根据浏览器类型选择不同的导出方法,确保在IE和非IE浏览器下都能正常工作。


jsp页面:

//打印
	function onPrint() {
		$.post("zwfw/workResult/spWorkListGztz/getPrintContext", {
			name : $("#name").val(),
			baseOrgName : $("#baseOrgName").val()
		}, function(data) {
			var Html = data.HMML;
			document.getElementById("Print2").innerHTML = Html;
			document.getElementById("Main").style.display = "none";

			document.getElementById("Print").style.display = "block";
			window.print();

			document.getElementById("Main").style.display = "block";

			document.getElementById("Print").style.display = "none";
		});
	}

	//导出Excel表格,mytable参数是待导出的table的id
	function tabletoexcel(mytable) {
		$
				.post(
						"zwfw/workResult/spWorkListGztz/getPrintContext",
						{
							name : $("#name").val(),
							baseOrgName : $("baseOrgName").val()
						},
						function(data) {
							var Html = data.html;
							document.getElementById("Print2").innerHTML = Html;

							// getExplore()返回1,说明是不是Google Chrome、Firefox、Opera、Safari,那么就认为是IE了。(网上流传的判断IE的js代码好多在Win7无法使用。。。。。。
							if (getExplorer() == 1) {
								//是IE的话,就调用toExcel()方法来导出Excel表格,不依赖微软的Excel产品。(toExcel()方法的定义见下面)
								toExcel(mytable, '');
								return;
							}

							// 不是IE的话就调用下面的代码导出Excel文件

							//获得id为mytable的table的html元素
							var table = document.getElementById(mytable);
							// 克隆(复制)此table元素,这样对复制品进行修改(如添加或改变table的标题等),导出复制品,而不影响原table在浏览器中的展示。
							table = table.cloneNode(true);
							//下面五行代码就是用来改变table中的某些信息的,不需要的话可以注释,或修改。

							var caption_orig = table
									.getElementsByTagName("caption");
							$(caption_orig).text(name);
							var th_first_ele = table.getElementsByTagName("th")[0];

							// 下面的代码才是真正用来将html table导出Excel表格(我从stackoverflow上看到的,修改了一点点,不会再有中文乱码问题了。)
							var uri = 'data:application/vnd.ms-excel;base64,';
							template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><?xml version="1.0" encoding="UTF-8" standalone="yes"?><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table style="vnd.ms-excel.numberformat:@">{table}</table></body></html>';
							base64 = function(s) {
								return window
										.btoa(unescape(encodeURIComponent(s)));
							};
							format = function(s, c) {
								return s.replace(/{(\w+)}/g, function(m, p) {
									return c[p];
								});
							};
							if (!table.nodeType)
								table = document.getElementById(table);
							var ctx = {
								worksheet : name || 'Worksheet',
								table : table.innerHTML
							};
							window.location.href = uri
									+ base64(format(template, ctx));

						});

	}

	// 判断浏览器类型 返回1表示IE
	function getExplorer() {
		var explorer = window.navigator.userAgent;
		if (explorer.indexOf("MSIE") >= 0) {
			return 1;
		} else if (explorer.indexOf("Firefox") >= 0) {
			return 0;
		} else if (explorer.indexOf("Chrome") >= 0) {
			return 0;
		} else if (explorer.indexOf("Opera") >= 0) {
			return 0;
		} else if (explorer.indexOf("Safari") >= 0) {
			return 0;
		} else {
			return 1;
		}
	}

	// 下面的所有函数代码都是为了在IE上能导出Excel表格(不会出现js栈溢出等eggache的problem。。IE is so eggache!!!!
	function toExcel(inTblId, inWindow) {
		try {
			var allStr = "";
			var curStr = "";
			if (inTblId != null && inTblId != "" && inTblId != "null") {
				curStr = getTblData(inTblId, inWindow);
			}
			if (curStr != null) {
				allStr += curStr;
			} else {
				alert("您要导出的表不存在!");
				return;
			}
			var fileName = getExcelFileName();
			doFileExport(fileName, allStr);
		} catch (e) {
			alert("导出发生异常:" + e.name + "->" + e.description + "!");
		}
	}
	function getTblData(inTbl, inWindow) {
		var caption_str = "";
		var rows = 0;
		var tblDocument = document;
		if (!!inWindow && inWindow != "") {
			if (!document.all(inWindow)) {
				return null;
			} else {
				tblDocument = eval(inWindow).document;
			}
		}
		var curTbl = tblDocument.getElementById(inTbl).cloneNode(true);
		if (curTbl.rows.length > 65000) {
			alert('源行数不能大于65000行');
			return false;
		}
		if (curTbl.rows.length <= 1) {
			alert('数据源没有数据');
			return false;
		}
		var outStr = caption_str + " \n";
		if (curTbl != null) {
			for (var j = 0; j < curTbl.rows.length; j++) {
				for (var i = 0; i < curTbl.rows[j].cells.length; i++) {
					if (i == 0 && rows > 0) {
						outStr += " \t";
						rows -= 1;
					}
					var tc = curTbl.rows[j].cells[i];
					if (j > 0 && tc.hasChildNodes()
							&& tc.firstChild.nodeName.toLowerCase() == "input") {
						if (tc.firstChild.type.toLowerCase() == "checkbox") {
							if (tc.firstChild.checked == true) {
								outStr += "是" + "\t";
							} else {
								outStr += "否" + "\t";
							}
						}
					} else {
						outStr += " " + curTbl.rows[j].cells[i].innerText
								+ "\t";
					}
					if (curTbl.rows[j].cells[i].colSpan > 1) {
						for (var k = 0; k < curTbl.rows[j].cells[i].colSpan - 1; k++) {
							outStr += " \t";
						}
					}
					if (i == 0) {
						if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) {
							rows = curTbl.rows[j].cells[i].rowSpan - 1;
						}
					}
				}
				outStr += "\r\n";
			}
		} else {
			outStr = null;
			alert(inTbl + "不存在!");
		}
		return outStr;
	}
	function getExcelFileName() {
		var d = new Date();
		var curYear = d.getYear();
		var curMonth = "" + (d.getMonth() + 1);
		var curDate = "" + d.getDate();
		var curHour = "" + d.getHours();
		var curMinute = "" + d.getMinutes();
		var curSecond = "" + d.getSeconds();
		if (curMonth.length == 1) {
			curMonth = "0" + curMonth;
		}
		if (curDate.length == 1) {
			curDate = "0" + curDate;
		}
		if (curHour.length == 1) {
			curHour = "0" + curHour;
		}
		if (curMinute.length == 1) {
			curMinute = "0" + curMinute;
		}
		if (curSecond.length == 1) {
			curSecond = "0" + curSecond;
		}
		var fileName = "公章使用台帐" + curYear + curMonth + curDate + curHour
				+ curMinute + curSecond + ".xls";
		return fileName;
	}
	function doFileExport(inName, inStr) {
		var xlsWin = null;
		if (!!document.all("glbHideFrm")) {
			xlsWin = glbHideFrm;
		} else {
			var width = 1;
			var height = 1;
			var openPara = "left=" + (window.screen.width / 2 + width / 2)
					+ ",top=" + (window.screen.height + height / 2)
					+ ",scrollbars=no,width=" + width + ",height=" + height;
			xlsWin = window.open("", "_blank", openPara);
		}
		xlsWin.document.write(inStr);
		xlsWin.document.close();
		xlsWin.document.execCommand('Saveas', true, inName);
		xlsWin.close();
	}

<div class="form-group">
				<button class="btn btn-info" id="btnShowAll" type="button"
					onclick="onPrint()">打印</button>
			</div>
			<div class="form-group">
				<button class="btn btn-info" id="btnShowAll" type="button"
					onclick="tabletoexcel('grdtable')">导出</button>
			</div>

		</div>
		<div class="col-sm-12">
			<table id="grid"></table>
			<div id="pager" style="height: 35px;"></div>
		</div>
		<div id="Print" style="display: none">
			<table width="100%">
				<tr>
					<td style="font-size: 25px; font-weight: bold; text-align: center;"
						colspan="9">公章使用台帐</td>
				</tr>
			</table>
			<div id="Print2"></div>
		</div>

controller:

@ResponseBody
 @RequestMapping(value = "/getPrintContext", method = RequestMethod.POST)
 public Map<String, Object> getPrintContext(){
  Map<String, Object> map = new HashMap<String, Object>();
  List<SpWorkListGztz> list = spWorkListGztzService.list();
  String   _html = "<table style=\"width:100%\" class=\"grdtable\"id=\"grdtable\"><tr><td width=\"10%\"></td><td width=\"10%\">日期</td><td width=\"10%\">姓名</td><td width=\"10%\">单位名称</td><td width=\"10%\">材料份数</td><td width=\"10%\">批准人</td><td width=\"10%\">个人缴费</td><td width=\"10%\">受理人</td><td width=\"10%\">备注</td></tr>";
  for(int i = 0; i < list.size(); i++){
   SpWorkListGztz spWorkListGztz = list.get(i);
   _html+="<tr><td>"+(i*1)+"</td>";
   _html+="<td>"+spWorkListGztz.getRecordInfo().getCreatedAt()+"</td>";
   _html+="<td>"+spWorkListGztz.getName()+"</td>";
   _html+="<td>"+spWorkListGztz.getBaseOrgName()+"</td>";
   _html+="<td>"+spWorkListGztz.getMaterialsCount()+"</td>";
   _html+="<td>"+spWorkListGztz.getApprover()+"</td>";
   _html+="<td>"+spWorkListGztz.getReceiver()+"</td>";
   _html+="<td>"+spWorkListGztz.getDescr()+"</td>";
   
   
  }
  
  _html+="</table>";
  map.put("html", _html);
  return map;





通常业务需求都是客户端一个导出按钮,发送请求到服务端,服务端写一个接口导出报表到客户端,客户可以自行下载。无论Struts或者springMVC均可。 @RequestMapping("Export") @ResponseBody public String getAll(HttpServletRequest request,HttpServletResponse response) throws IOException{ //集合为需要导出数据,数据查询得到,这里测试就不写了。 List<User> list=new ArrayList<User>(); // 生成Excel文件 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet sheet = hssfWorkbook.createSheet("测试数据"); // 表头 HSSFRow headRow = sheet.createRow(0); headRow.createCell(0).setCellValue("姓名"); headRow.createCell(1).setCellValue("手机号码"); headRow.createCell(2).setCellValue("年龄"); // 表格数据 for (User user : list) { HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); dataRow.createCell(0).setCellValue(user.getName()); dataRow.createCell(1).setCellValue(user.getPhone()); dataRow.createCell(2).setCellValue(user.getAge()); } // 下载导出(一个流两个头) // 设置头信息 response.setContentType( "application/vnd.ms-excel"); // MIME .jpg .xls .mp3 .avi .txt .exe String filename = "驾驶员数据.xls"; //如果为Struts框架,获得requestresponse可用ServletActionContext String agent = request .getHeader("user-agent"); filename = FileUtils.encodeDownloadFilename(filename, agent); response.setHeader("Content-Disposition", "attachment;filename=" + filename); ServletOutputStream outputStream = response .getOutputStream(); //输出 hssfWorkbook.write(outputStream); // 关闭 hssfWorkbook.close(); //System.out.println("导出成功"); return "success"; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值