js导出excel

19 篇文章 0 订阅
14 篇文章 0 订阅
<head>
	<meta charset="UTF-8">
	<title>js导出excel</title>
	<script src="js/xlsx.full.min.js" type="text/javascript" charset="utf-8"></script>
</head>

<body>
	<button onclick="downloadExl(jsono)">导出</button>
	<a href="" download="附近商家.xlsx" id="downloadA"></a>
	<script>
		var jsono = [{
			"姓名": "张三",
			"年龄": "30",
			"性别": "男"
		}, {
			"姓名": "李四",
			"年龄": "40",
			"性别": "女"
		}, {
			"姓名": "王五",
			"年龄": "50",
			"性别": "男"
		}];
		var tmpDown; //导出的二进制对象
		function downloadExl(json, type) {
			//根据json数据,获取excel的第一行(例如:姓名、年龄、性别)存至map
			var tmpdata = json[0];
			json.unshift({});
			var keyMap = []; //获取keys
			for(var k in tmpdata) {
				keyMap.push(k);
				json[0][k] = k;
			}

			var tmpdata = [];
			json.map((v, i) => keyMap.map((k, j) => Object.assign({}, {
				v: v[k],
				position: (j > 25 ? getCharCol(j) : String.fromCharCode(65 + j)) + (i + 1)
			}))).reduce((prev, next) => prev.concat(next)).forEach((v, i) => tmpdata[v.position] = {
				v: v.v
			});

			//设置区域,比如表格从A1到D10
			var outputPos = Object.keys(tmpdata);
			var tmpWB = {
				SheetNames: ['mySheet'], //保存的表标题
				Sheets: {
					'mySheet': Object.assign({},
						tmpdata, //内容
						{
							'!ref': outputPos[0] + ':' + outputPos[outputPos.length - 1] //设置填充区域
						})
				}
			};

			//创建二进制对象写入转换好的字节流
			tmpDown = new Blob([s2ab(XLSX.write(tmpWB, {
					bookType: (type == undefined ? 'xlsx' : type),
					bookSST: false,
					type: 'binary'
				} //这里的数据是用来定义导出的格式类型
			))], {
				type: ""
			});

			var href = URL.createObjectURL(tmpDown); //创建对象超链接
			document.getElementById("downloadA").href = href; //绑定a标签
			document.getElementById("downloadA").click(); //模拟点击实现下载
			setTimeout(function() { //延时释放
				URL.revokeObjectURL(tmpDown); //用URL.revokeObjectURL()来释放这个object URL
			}, 100);
		}

		//字符串转字符流
		function s2ab(s) {
			var buf = new ArrayBuffer(s.length);
			var view = new Uint8Array(buf);
			for(var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
			return buf;
		}

		//将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
		function getCharCol(n) {
			let temCol = '',
				s = '',
				m = 0
			while(n > 0) {
				m = n % 26 + 1
				s = String.fromCharCode(m + 64) + s
				n = (n - m) / 26
			}
			return s
		}
	</script>
</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值