jsp导出Excel文件

jsp导出Excel文件


这种博客网上有很多了,但是有些由于浏览器版本问题,还有数据文本问题零碎的东西
结合我遇到的问题,在这里记录一下我自己的小笔记,欢迎大家来践踏,哈哈哈。
话不多说,直接上代码

以下是jsp

<table id="predetermineTable" class="table table-hover my-table table-bordered" style="width: 100%">
					<thead>
						<tr>
							<th>标题</th>
							<th>姓名</th>
							<th>身份证号</th>
							<th>单位</th>
							<th>活动开始时间</th>
							<th>活动结束时间</th>
							<th>报名时间</th>
							<th>状态</th>
						</tr>
					</thead>
					<tbody>
						<c:forEach items="${dataList}" var="item" varStatus="status">
							<tr id="dataRow_${item.announcementId}" class="dataRow" >
								<td>${item.announcementTitle}</td>
								<td>${item.realName}</td>
								<td style="mso-number-format:'\@';">${item.idCard}</td>
								<td>${item.unitsName}</td>
								<td>
									<fmt:formatDate value="${item.showStart}" pattern="yyyy-MM-dd HH:mm:ss"/>
								</td>
								<td>
									<fmt:formatDate value="${item.showEnd}" pattern="yyyy-MM-dd HH:mm:ss"/>
								</td>
								<td>
									<fmt:formatDate value="${item.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/> 
								</td>
								<td>
									<c:if test="${item.predetermineStatus ==1}">有效</c:if>
									<c:if test="${item.predetermineStatus ==0}">无效</c:if>
								</td>
							</tr>
						</c:forEach>
					</tbody>
				</table>

以上是table部分要注意的是如下,是解决一串数字比如身份证号,银行账号等导出后变科学计数法的问题(这块主要针对IE吧,其它浏览器可以在table标签里直接设置style属性,下面有)

	<td style="mso-number-format:'\@';">${item.idCard}</td>

以下是js

	var idTmr;
function getExplorer() {
	var explorer = window.navigator.userAgent;
	// ie  判断IE浏览器的方式大都用这个,但是也有不好使的时候
	if (explorer.indexOf("MSIE") >= 0) {
		return 'ie';
	}
	//上边不好使就用这个方法判断是不是IE,因为只有IE才有ActiveX控件
	if (!!window.ActiveXObject || "ActiveXObject" in window) {
		return 'ie'; 
	}
	// firefox
	else if (explorer.indexOf("Firefox") >= 0) {
		return 'Firefox';
	}
	// Chrome
	else if (explorer.indexOf("Chrome") >= 0) {
		return 'Chrome';
	}
	// Opera
	else if (explorer.indexOf("Opera") >= 0) {
		return 'Opera';
	}
	// Safari
	else if (explorer.indexOf("Safari") >= 0) {
		return 'Safari';
	}
}

function exportToExcel(tableid) {// 整个表格拷贝到EXCEL中
	if (getExplorer() == 'ie') {
		var curTbl = document.getElementById(tableid);
		var oXL = new ActiveXObject("Excel.Application");

		// 创建AX对象excel
		var oWB = oXL.Workbooks.Add();
		// 获取workbook对象
		var xlsheet = oWB.Worksheets(1);
		// 激活当前sheet
		var sel = document.body.createTextRange();
		sel.moveToElementText(curTbl);
		// 把表格中的内容移到TextRange中
		sel.select;
		// 全选TextRange中内容
		sel.execCommand("Copy");
		// 复制TextRange中内容
		xlsheet.Paste();
		// 粘贴到活动的EXCEL中
		oXL.Visible = true;
		// 设置excel可见属性

		try {
			table = document.getElementById(table)
			// 这是作者用于命名Excel文件的方法,你有更好的方法那更好
			var table = document.getElementById("predetermineTable");
			var v0 = table.rows[1].cells[0].innerHTML;
			var filename = v0 + "预约报名表";
			
			var fname = oXL.Application.GetSaveAsFilename(filename+".xls",
					"Excel Spreadsheets (*.xls), *.xls");
		} catch (e) {
			print("Nested catch caught " + e);
		} finally {
			oWB.SaveAs(fname);
			oWB.Close(savechanges = false);
			// xls.visible = false;
			oXL.Quit();
			oXL = null;
			// 结束excel进程,退出完成
			// window.setInterval("Cleanup();",1);
			idTmr = window.setInterval("Cleanup();", 1);
		}
	} else {
		tableToExcel(tableid)
	}
}

function Cleanup() {
	window.clearInterval(idTmr);
	CollectGarbage();
}

var tableToExcel = (function() {
	var uri = 'data:application/vnd.ms-excel;base64,', 
	//准备好要生成Excel的模板
	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>'
			+ '<x:ExcelWorkbook>'
			+ '<x:ExcelWorksheets>'
			+ '<x:ExcelWorksheet>'
			+ '<x:Name>{worksheet}</x:Name>'
			+ '<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];
		})
	}

	return function(table, name) {
		if (!table.nodeType)
		table = document.getElementById(table)
		// 获得主题名 命名文件名和excel标题
		var table = document.getElementById("predetermineTable");
		var v0 = table.rows[1].cells[0].innerHTML;
		var name = v0 + "预约报名表";
		//组好要导出的数据源
		var ctx = {
			worksheet : name || "Worksheet",
			//这里是作者主动加的excel标题(合并并居中)
			table : table.innerHTML.replace("<thead>","<thead><tr><th colspan='8'>"+name+"</th></tr>")
		}
		//format(template, ctx)这个方法就是类似于freemark一样,往模板里填数据
		//不需要改名字就如下直接输出
		//window.location.href = uri + base64(format(template, ctx));
		//需要改文件名字就如下
		var link = uri + base64(format(template, ctx));
		var a = document.createElement("a");
		a.download = name+".xls";
		a.href = link;
		a.click();
		//如果上面方法不行的话就用下面的方法
        //document.getElementById("predetermineExcelButton").href = uri + base64(format(template, ctx));
		//document.getElementById("predetermineExcelButton").download = "fhaio.xls";
		//document.getElementById("predetermineExcelButton").click();
	}
})()

有错的地方欢迎指正,谢谢 。
ps :第一次写博客,有不好的地方多多包涵~~~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值