// ==UserScript==
// @name 美团商家流量导出Excel
// @namespace http://tampermonkey.net/
// @version 0.1.7
// @description 增加按钮
// @author yhpl-pgq
// @match https://shangoue.meituan.com/*
// @require http://cdn.staticfile.org/xlsx/0.16.1/xlsx.mini.min.js
// @grant GM_xmlhttpRequest
// ==/UserScript==
var xmlExportContent = {traffic:[], source:[]};
var yhplHTTPCount = 0;
var EXCEL_TYPE_STORE_DETAIL = 0;
var EXCEL_TYPE_STORE_COMMENT = 1;
var EXCEL_TYPE_STORE_SEARCH_WORD = 2;
const SEARCH_WORD_ROW = 30;
(function() {
'use strict';
yhplHTTPCount = 0;
EXCEL_TYPE_STORE_DETAIL = 0;
EXCEL_TYPE_STORE_COMMENT = 1;
EXCEL_TYPE_STORE_SEARCH_WORD = 2;
addButton();
console.log('enter')
})();
function addButton(){
var headerLeft = $("#reload-page")[0];
var header = headerLeft.parentElement;
var button = document.createElement('BUTTON');
button.innerText = "我是小可爱";
button.onclick = ()=>{getStore(EXCEL_TYPE_STORE_DETAIL)};
button.id = getButtonIdByType(EXCEL_TYPE_STORE_DETAIL);
header.appendChild(button);
var buttonComment = document.createElement('BUTTON');
buttonComment.innerText = "评论分析";
buttonComment.onclick = ()=>{getStore(EXCEL_TYPE_STORE_COMMENT)};
console.log('EXCEL_TYPE_STORE_COMMENT:'+EXCEL_TYPE_STORE_COMMENT);
buttonComment.id = getButtonIdByType(EXCEL_TYPE_STORE_COMMENT);
header.appendChild(buttonComment);
appendButton(header, EXCEL_TYPE_STORE_SEARCH_WORD, '热词分析(慎点)')
//var div = $("pull-right")[0];
//div.style.display="none";
// document.getElementsByClassName('pull-right')[0].style.display = 'none'
}
function appendButton(parent, type, text){
var bt = document.createElement('BUTTON');
bt.innerText = text;
bt.onclick = ()=>{getStore(type)};
bt.id = getButtonIdByType(type);
parent.appendChild(bt);
}
function getButtonIdByType(type){
switch (type){
case EXCEL_TYPE_STORE_DETAIL:
return 'yhplExport';
case EXCEL_TYPE_STORE_COMMENT:
return 'yhplComment';
case EXCEL_TYPE_STORE_SEARCH_WORD:
return 'yhplSearch';
default:
return 'yhpl';
}
}
function onStoreSuccess(type, node){
var code = node.code
window.node = node;
console.log('onSuccess, code:'+code);
if (code == 0){
var data = node.data;
// data = data.slice(0, 1);
// data[0].id = '8346785';
switch (type){
case EXCEL_TYPE_STORE_DETAIL:
onStoreSuccessTypeDetail(data);
break;
case EXCEL_TYPE_STORE_COMMENT:{
data = data.slice(1, data.length);
onStoreSuccessTypeComment(data);
break;
}
case EXCEL_TYPE_STORE_SEARCH_WORD:{
data = data.slice(1, data.length);
//data = data.slice(1, 2);
//data[0].id = '8346785';
onStoreSuccessTypeSearchWord(data);
break;
}
default:
console.log("未处理的type:"+type);
break;
}
}
}
function onStoreSuccessTypeDetail(stores){
var length = stores.length;
var totalRequestSize = length * 2;
for(var poi = 0; poi < length; poi++){
var child = stores[poi];
console.log(child.poiName+"," +child.id);
getStoreDetail(poi * 2, totalRequestSize, child.id, child.poiName);
getStoreTrafficSource(poi * 2 + 1, totalRequestSize, child.id, child.poiName);
yhplSleep();
}
}
function onStoreSuccessTypeComment(stores){
var length = stores.length;
var totalRequestSize = length * 2;
for(var poi = 0; poi < length; poi++){
var child = stores[poi];
var storeIndex = poi * 5 + 1;
for (var i = 0; i<5; i++){
var commentRow = [];
commentRow.push(getStoreName(child.poiName, child.id));
xmlExportContent.comment[storeIndex + i] = commentRow;
}
console.log(child.poiName+"," +child.id);
getComment(poi * 2, totalRequestSize, child.id, child.poiName);
getCommentSKUList(poi * 2 + 1, totalRequestSize, child.id, child.poiName);
yhplSleep();
}
}
function onStoreSuccessTypeSearchWord(stores){
var length = stores.length;
var totalRequestSize = length * 4;
for(var poi = 0; poi < length; poi++){
var child = stores[poi];
var storeIndex = poi * SEARCH_WORD_ROW + 1;
for (var i = 0; i<SEARCH_WORD_ROW; i++){
var row = [];
row.push(getStoreName(child.poiName, child.id));
xmlExportContent.searchAllZone[storeIndex + i] = row;
xmlExportContent.searchMyZone[storeIndex + i] = row.concat();
}
console.log(child.poiName+"," +child.id);
getSearchWord(poi * 4, totalRequestSize, child.id, child.poiName, true, true);//全部商圈7天环比
getSearchWord(poi * 4 + 1, totalRequestSize, child.id, child.poiName, true, false);//全部商圈昨天环比
getSearchWord(poi * 4 + 1, totalRequestSize, child.id, child.poiName, false, true);//我的商圈7天环比
getSearchWord(poi * 4 + 3, totalRequestSize, child.id, child.poiName, false, false);//我的商圈昨天环比
yhplSleep();
}
}
async function yhplSleep() {
await sleep(200)
// console.log('yhplSleep end!')
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
function onStoreError(type, e){
console.log(e);
console.log('onError');
}
function getStore(type){
console.log('getStore enter type: '+type);
switch (type){
case EXCEL_TYPE_STORE_DETAIL:{
xmlExportContent = {traffic:[], source:[]};
xmlExportContent.traffic.push(['店铺名字', '指标名称', '当前', '7日对比', '行业对比'])
xmlExportContent.source.push(['店铺名字', '指标名称','曝光人数', '搜索', '商家列表', '订单页', '其他', '活动专区', '为你优选'])
break;
}
case EXCEL_TYPE_STORE_COMMENT: {
xmlExportContent = {comment:[], source:[]};
xmlExportContent.comment.push(['店铺名字', '商家评分', '质量评分', '包装评分', '配送满意度', '平均配送时长',
'评价榜', '好评榜-商品名称', '好评榜-赞', '好评榜-销量','好评榜-图片', '差评榜-商品名称', '差评榜-踩', '差评榜-销量','差评榜-图片'])
break;
}
case EXCEL_TYPE_STORE_SEARCH_WORD: {
xmlExportContent = {searchAllZone:[], searchMyZone:[]};
xmlExportContent.searchAllZone.push(['店铺名字', '排名', '搜索词', '搜索次数', '搜索次数前7日', '搜索次数环比', '搜索词(昨日)', '搜索次数(昨日)','搜索次数前日', '搜索次数环比(昨日)']);
xmlExportContent.searchMyZone.push(['店铺名字', '排名', '搜索词', '搜索次数', '搜索次数前7日', '搜索次数环比', '搜索词(昨日)', '搜索次数(昨日)','搜索次数前日', '搜索次数环比(昨日)']);
break;
}
default : {
console.log("未处理的type");
return;
}
}
yhplHTTPCount = 0;
var URL_STORE = 'https://shangoue.meituan.com/api/poi/poiList';
$.ajax({
type: "POST",
url: URL_STORE,
data: '',
success: (node) => {onStoreSuccess(type, node)},
error:(e) => onStoreError(type, e),
dataType: 'json'
});
}
function onStoreDetailSuccess(step, total, text, storeID, storeName){
console.log('onStoreDetailSuccess:'+step);
var node = parseJson(text);
if (!node){
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
return;
}
var code = node.code
console.log('onSuccess, code:'+code+",step:"+step);
if (code == 0){
var data = node.data;
var storeDetailRows = [];
if (data != null) {
var length = data.length;
for(var index = 0; index < length; index++){
var child = data[index];
var indexStr = child.index;
var indexParsed = acceptDataNode(indexStr);
var indexInt = getTrafficIndexAsInt(indexStr);
if (indexParsed.length > 0 && indexInt >= 0){
var current = child.current;
var ring = child.ring;
var peer= child.peer;
if (peer== null && ring == null && peer == null) {
continue;
}
var storeDetailRow = [];
storeDetailRow.push(getStoreName(storeName, storeID));
storeDetailRow.push(indexParsed);
storeDetailRow.push(appendDateSuffix(indexStr, current));
storeDetailRow.push(appendDateSuffix(indexStr, ring));
storeDetailRow.push(appendDateSuffix(indexStr, peer));
storeDetailRows[indexInt] = storeDetailRow;
// console.log(child.index+"," +child.current);
}
}
var rows = storeDetailRows.length;
for(var rowIndex = 0; rowIndex < rows; rowIndex++){
var row = storeDetailRows[rowIndex];
if(row == null){
continue;
}
xmlExportContent.traffic.push(row);
}
} else {
console.log('数据获取失败:'+storeID);
}
} else {
console.log('数据获取失败:'+storeID+",code:"+code);
}
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
}
function getStoreName(storeName, storeID){
if (storeID > 0){
return (storeName+"("+storeID+")");
} else {
return storeName;
}
}
function onStoreTrafficSourceSuccess(step, total, text, storeID, storeName){
var node = parseJson(text);
if (!node){
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
return;
}
var code = node.code
//console.log('onSuccess, code:'+code);
if (code != 0) {
console.log('流量来源数据获取失败#1:'+storeID);
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
return;
}
var data = node.data;
if(data == null) {
console.log('流量来源数据获取失败#2:'+storeID+",step:"+step);
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
return;
}
var detail = data.detail;
if (detail == null) {
console.log('流量来源数据获取失败#3:'+storeID);
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
return;
}
var storeTrafficSourceRows = ['未知', '曝光来源', 0, 0, 0, 0, 0, 0, 0];
storeTrafficSourceRows[0] = getStoreName(storeName, storeID);
storeTrafficSourceRows[2] = data.current;
var length = detail.length;
for(var index = 0; index < length; index++){
var child = detail[index];
var indexStr = child.index;
var indexParsed = getIndexAsInt(indexStr);
if (indexParsed>=0){
storeTrafficSourceRows[indexParsed + 3] = child.current;
}
}
xmlExportContent.source.push(storeTrafficSourceRows);
showProgress(EXCEL_TYPE_STORE_DETAIL, step, total);
}
function appendDateSuffix(index, val){
if (val == null){
return "";
}
if (index.indexOf('RATE')>=0){
val = val + "%";
}
return val;
}
function acceptDataNode(index) {
switch (index){
case "FLOW_POI_EXPOSE_UV":
return "曝光人数";
case "FLOW_POI_EXPOSE_PV":
return "曝光次数";
case "FLOW_WEIGHTED_AVG_RANKING":
return "平均排名";
case "FLOW_HOME_PAGE_EXPOSE_RATE":
return "入店转化率";
case "FLOW_HOME_PAGE_UV":
return "入店人数";
case "FLOW_HOME_PAGE_PV":
return "入店次数";
case "FLOW_HOME_PAGE_DURATION":
return "入店访问时长";
case "FLOW_SUBMITTED_HOME_PAGE_RATE":
return "下单转化率";
case "FLOW_SUBMITTED_UV":
return "下单人数";
case "FLOW_SUBMITTED_PV":
return "下单次数";
case "FLOW_SUBMITTED_ACTUAL_AMT":
return "下单金额";
case "FLOW_PAY_UV":
return "支付人数";
case "FLOW_PAY_ACTUAL_AMT":
return "支付金额";
case "FLOW_PAY_SUBMITTED_RATE":
return "支付转化率";
case "poiCommentScore":
return "商家评分";
case "goodCommentDeliveryRate":
return "配送满意度";
case "packingScore":
return "包装评分";
case "qualityScore":
return "质量评分";
case "avgDeliveryDuration":
return "平均配送时长";
default:
return index;
}
}
function getTrafficIndexAsInt(index) {
switch (index){
case "FLOW_POI_EXPOSE_UV":
return 0;
case "FLOW_POI_EXPOSE_PV":
return 1;
case "FLOW_WEIGHTED_AVG_RANKING":
return 2;
case "FLOW_HOME_PAGE_EXPOSE_RATE":
return 3;
case "FLOW_HOME_PAGE_UV":
return 4;
case "FLOW_HOME_PAGE_PV":
return 5;
case "FLOW_HOME_PAGE_DURATION":
return 6;
case "FLOW_SUBMITTED_HOME_PAGE_RATE":
return 7;
case "FLOW_SUBMITTED_UV":
return 8;
case "FLOW_SUBMITTED_PV":
return 9;
case "FLOW_SUBMITTED_ACTUAL_AMT":
return 10;
case "FLOW_PAY_UV":
return 11;
case "FLOW_PAY_ACTUAL_AMT":
return 12;
case "FLOW_PAY_SUBMITTED_RATE":
return 13;
default:
return -1;
}
}
function getIndexAsInt(index){
switch (index){
case "FLOW_SOURCE_FROM_SEARCH":
return 0;
case "FLOW_SOURCE_FROM_POI_LIST":
return 1;
case "FLOW_SOURCE_FROM_ORDER_PAGE":
return 2;
case "FLOW_SOURCE_FROM_OTHER":
return 3;
case "FLOW_SOURCE_FROM_ACT_AREA":
return 4;
case "FLOW_SOURCE_FROM_SELECTED":
return 5;
default:
return -1;
}
}
function getCommentIndex(index){
switch(index){
case "poiCommentScore"://商家评分
return 0;
case "qualityScore"://质量评分
return 1;
case "packingScore"://包装评分
return 2;
case "goodCommentDeliveryRate"://配送满意度
return 3;
case "avgDeliveryDuration"://平均配送时长
return 4;
default:
return -1;
}
}
function getStoreDetail(index, total, storeID, storeName){
var URL_PREFIX = 'https://waimaieapp.meituan.com/igate/recoanalysis/flowAnalysisV4/recentDays/flowTransformation?acctId=69808847&source=0&recentDays=7';
var storeParmas = '&cityIds=0&wmPoiId='+storeID;
var URL_DETAIL = URL_PREFIX + storeParmas
GM_xmlhttpRequest({
method: "GET",
url: URL_DETAIL,
data: '',
headers: {
"Referer": "https://waimaieapp.meituan.com/igate/",
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function(res){
console.log('getStoreDetail:'+index);
// console.log('getStoreDetail:'+res.status);
if(res.status === 200){
// console.log('成功')
//console.log(res);
// console.log('getStoreDetail:onStoreDetailSuccess');
onStoreDetailSuccess(index, total, res.response, storeID, storeName);
}else{
console.log('失败')
//console.log(res)
}
},
onerror : function(err){
console.log('error')
console.log(err)
}
});
}
function getStoreTrafficSource(index, total, storeID, storeName){
var URL_PREFIX = 'https://waimaieapp.meituan.com/igate/recoanalysis/flowAnalysisV4/recentDays/flowTrafficSource?acctId=69808847&source=0&recentDays=7';
var storeParmas = '&cityIds=0&wmPoiId='+storeID;
var URL_DETAIL = URL_PREFIX + storeParmas
GM_xmlhttpRequest({
method: "GET",
url: URL_DETAIL,
data: '',
headers: {
"Referer": "https://waimaieapp.meituan.com/igate/",
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function(res){
if(res.status === 200){
onStoreTrafficSourceSuccess(index, total, res.response, storeID, storeName);
}else{
console.log(res)
}
},
onerror : function(err){
console.log('error')
console.log(err)
}
});
}
//segment 评价
function getComment(index, total, storeID, storeName){
var URL_PREFIX = 'https://waimaieapp.meituan.com/igate/recoanalysis/commentAnalysis/scoreAnalysisDetail/recentDays?acctId=69808847&cityId=0&recentDays=30&source=0';
var storeParmas = '&wmPoiId='+storeID;
var URL_DETAIL = URL_PREFIX + storeParmas
GM_xmlhttpRequest({
method: "GET",
url: URL_DETAIL,
data: '',
headers: {
"Referer": "https://waimaieapp.meituan.com/igate/",
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function(res){
if(res.status === 200){
onCommentSuccess(index, total, res.response, storeID, storeName);
}else{
console.log('失败')
}
},
onerror : function(err){
console.log('error')
console.log(err)
}
});
}
function parseJson(text){
var node = null;
try {
node = JSON.parse(text);
} catch(e){
console.log('parseJson error:'+e);
}
return node;
}
function onCommentSuccess(step, total, text, storeID, storeName){
console.log('onCommentSuccess:'+step);
var node = parseJson(text);
if (!node){
showProgress(EXCEL_TYPE_STORE_COMMENT, step, total);
return;
}
var code = node.code
if (code != 0){
return;
}
var data = node.data;
if (data == null){
showProgress(EXCEL_TYPE_STORE_COMMENT, step, total);
return;
}
var scoreData = data.scoreData;
if (scoreData == null){
showProgress(EXCEL_TYPE_STORE_COMMENT, step, total);
return;
}
var length = scoreData.length;
var storeIndex = parseInt(step / 2) * 5 + 1;//表头 + 1
var commentCols = xmlExportContent.comment[storeIndex];
for(var index = 0; index < length; index++){
var child = scoreData[index];
var indexStr = child.index;
var indexParsed = acceptDataNode(indexStr);
var indexInt = getCommentIndex(indexStr);
if (indexParsed.length > 0 && indexInt >= 0){
var current = child.currentValue;
var ring = child.ringValue;
if (current == null) {
continue;
}
commentCols[indexInt + 1] = current;//第一列 店铺名称skip
}
}
//复制到剩余的行
for(var rowIndex = 1; rowIndex < 5; rowIndex++){
var row = xmlExportContent.comment[storeIndex + rowIndex];
for (var col = 0; col < 4; col++) {
row[col + 1] = commentCols[col + 1];
}
}
showProgress(EXCEL_TYPE_STORE_COMMENT, step, total);
}
function getCommentSKUList(index, total, storeID, storeName){
var URL_PREFIX = 'https://waimaieapp.meituan.com/igate/recoanalysis/commentAnalysis/commodityRankings/recentDays?acctId=69808847&cityId=0&recentDays=30&source=0';
var storeParmas = '&wmPoiId='+storeID;
var URL_DETAIL = URL_PREFIX + storeParmas
GM_xmlhttpRequest({
method: "GET",
url: URL_DETAIL,
data: '',
headers: {
"Referer": "https://waimaieapp.meituan.com/igate/",
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function(res){
if(res.status === 200){
onCommentSKUListSuccess(index, total, res.response, storeID, storeName);
}else{
console.log('失败')
}
},
onerror : function(err){
console.log('error')
console.log(err)
}
});
}
function onCommentSKUListSuccess(step, total, text, storeID, storeName){
console.log('onCommentSKUListSuccess:'+step);
var node = parseJson(text);
if (!node){
showProgress(EXCEL_TYPE_STORE_COMMENT, step, total);
return;
}
var code = node.code
if (code == 0){
var data = node.data;
var bad = data.bad;
var good = data.good;
if (bad != null || good != null) {
var storeIndex = parseInt(step / 2) * 5 + 1;
// var commentCols = xmlExportContent.comment[storeIndex + 1];//表头 + 1
var offset = 6;
for(var index = 0; index < 5; index++){
var commentCols = xmlExportContent.comment[storeIndex + index];
commentCols[offset] = index + 1;
appendSKU(commentCols, offset, good[index], true);
appendSKU(commentCols, offset + 4, bad[index], false);
}
} else {
console.log('数据获取失败:'+storeID);
}
} else {
console.log('数据获取失败:'+storeID+",code:"+code);
}
showProgress(EXCEL_TYPE_STORE_COMMENT, step, total);
}
function appendSKU(row, offset, sku, goodOrBad){
if (!sku){
return;
}
row[offset + 1] = sku.productName;
row[offset + 2] = goodOrBad ? sku.upCount : sku.downCount;
row[offset + 3] = sku.salesCount;
row[offset + 4] = sku.picUrl;
}
//endsegment 评价
//segment 搜索热词
function getSearchWord(step, total, storeID, storeName, allZoneOrMyZone, seventDaysOrYesterday){
var searchType = seventDaysOrYesterday ? "searchWordRankHot" : "searchWordRankGrow";
var peerType = allZoneOrMyZone ? 0 : 1;
var colOffset = seventDaysOrYesterday ? 0 : 4;
var url = 'https://waimaieapp.meituan.com/igate/recoanalysis/flowAnalysis/searchword/searchWordRank';
var data = 'acctId=69808847&peerType='+peerType+'&recentDays=7&searchWordType='+searchType+'&source=0&wmPoiId='+storeID;
GM_xmlhttpRequest({
method: "POST",
url: url,
data: data,
headers: {
"Referer": "https://waimaieapp.meituan.com/igate/",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
onload: function(res){
if(res.status === 200){
onSearchWordSuccess(step, total, res.response, storeID, storeName, allZoneOrMyZone, colOffset);
}else{
console.log('失败')
}
},
onerror : function(err){
console.log('error')
console.log(err)
}
});
}
function onSearchWordSuccess(step, total, text, storeID, storeName, allZone, colOffset){
console.log('onSearchWordSuccess:'+step);
var node = parseJson(text);
if (!node){
showProgress(EXCEL_TYPE_STORE_SEARCH_WORD, step, total);
return;
}
var code = node.code
if (code != 0){
showProgress(EXCEL_TYPE_STORE_SEARCH_WORD, step, total);
return
}
var data = node.data;
if(!data){
showProgress(EXCEL_TYPE_STORE_SEARCH_WORD, step, total);
return
}
var length = data.length;
length = Math.min(length, SEARCH_WORD_ROW);
var rowOffset = parseInt(step / 5) * SEARCH_WORD_ROW + 1;
for(var index = 0; index < length; index++){
var commentCols = allZone ? xmlExportContent.searchAllZone[rowOffset + index] : xmlExportContent.searchMyZone[rowOffset + index];
commentCols[1 + colOffset + 1] = data[index].searchWord;//搜索热词
var count = data[index].searchCnt;//搜索次数
var searchCntBefore = data[index].searchCntBefore;//环比
var diffCnt = data[index].diffCnt;//环比
commentCols[1 + colOffset + 2] = count;
if (colOffset == 0){
commentCols[1 + colOffset] = index + 1;
commentCols[1 + colOffset + 3] = count - data[index].diffCnt;
} else{
commentCols[1 + colOffset + 3] = searchCntBefore;
}
commentCols[1 + colOffset + 4] = data[index].amplitude;//比例
}
showProgress(EXCEL_TYPE_STORE_SEARCH_WORD, step, total);
}
//endsegment 搜索热词
function showProgress(type, step, total){
yhplHTTPCount = yhplHTTPCount + 1;
console.log('type:'+type+',total:'+yhplHTTPCount+", index:"+step);
var id = getButtonIdByType(type);
console.log('#### : '+id);
var button = document.getElementById(id);
//var button = $("#yhplExport")[0];
button.innerText = "导出进度:"+yhplHTTPCount + "/ "+total;
// console.log(xmlExportContent);
if (yhplHTTPCount >= total){
button.innerText = "下载Excel";
exportAsXLS(type, xmlExportContent);
}
}
//segment excel
function exportAsXLS(type, table){
switch (type){
case EXCEL_TYPE_STORE_DETAIL:{
var sheet = XLSX.utils.aoa_to_sheet(table.traffic);
var source = XLSX.utils.aoa_to_sheet(table.source);
openDownloadDialog(sheet2blob([{sheet: sheet,name:'流量分析'},{sheet: source,name:'流量来源'}]), '流量分析.xlsx');
break;
}
case EXCEL_TYPE_STORE_COMMENT:{
var comment = XLSX.utils.aoa_to_sheet(table.comment);
// var source = XLSX.utils.aoa_to_sheet(table.source);
// openDownloadDialog(sheet2blob([{sheet: sheet,name:'评价分析'},{sheet: source,name:'流量来源'}]),excelName);
openDownloadDialog(sheet2blob([{sheet: comment,name:'评价分析'}]), '评价分析.xlsx');
break;
}
case EXCEL_TYPE_STORE_SEARCH_WORD:{
openDownloadDialog(sheet2blob([{sheet: XLSX.utils.aoa_to_sheet(table.searchAllZone),name:'全部商圈'},
{sheet: XLSX.utils.aoa_to_sheet(table.searchMyZone),name:'我的商圈'}]), '热词分析.xlsx');
break;
}
}
}
function sheet2blob(sheets) {
var sheetsSize = sheets.length;
var SheetNames = [];
var Sheets = {};
for (var index = 0; index<sheets.length; index++){
var child = sheets[index];
var sheetName = child.name || 'sheet'+(index+1);
SheetNames.push(sheetName);
var sheet = child.sheet;
Sheets[sheetName] = sheet;
}
var workbook = {
SheetNames: SheetNames,
//Sheets: {}
Sheets: Sheets
};
//workbook.Sheets[sheetName] = sheet; // 生成excel的配置项
var wopts = {
bookType: 'xlsx', // 要生成的文件类型
bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
type: 'binary'
};
var wbout = XLSX.write(workbook, wopts);
var blob = new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}); // 字符串转ArrayBuffer
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;
}
return blob;
}
function openDownloadDialog(url, saveName) {
if (typeof url == 'object' && url instanceof Blob) {
url = URL.createObjectURL(url); // 创建blob地址
}
var aLink = document.createElement('a');
aLink.href = url;
aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
var event;
if (window.MouseEvent) event = new MouseEvent('click');
else {
event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
}
aLink.dispatchEvent(event);
}
//eng segment excel