功能主要是通過導入excel生成坐標,在把生成好的坐標導出excel
寫這個功能之前應為公司要做離線地圖,要把所有的企業標記在地圖上,庫里有好幾萬家企業,沒有坐標,最笨的方法就是一個一個查,在一個一個更新,那完蛋了。所以就寫了這個方法,先批量生成坐標,然后生成excel,再寫一個存儲過程更新數據庫。(離線地圖的開發等有時間寫一下吧)
比較重要的幾個js文件

html部分:
| 名稱 | x | y |
下面是代碼:
// 在線讀入excel
function readWorkbookFromLocalFile(file, callback) {
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
var workbook = XLSX.read(data, {
type: 'binary'
});
if(callback) callback(workbook);
};
reader.readAsBinaryString(file);
}
$(function() {
document.getElementById('file').addEventListener('change', function(e) {
var files = e.target.files;
if(files.length == 0) return;
var f = files[0];
if(!/\.xlsx$/g.test(f.name)) {
alert('僅支持讀取xlsx格式!');
return;
}
readWorkbookFromLocalFile(f, function(workbook) {
readWorkbook(workbook);
});
});
//loadRemoteFile('./sample/test.xlsx');
});
function readWorkbook(workbook) {
var sheetNames = workbook.SheetNames; // 工作表名稱集合
var worksheet = workbook.Sheets[sheetNames[0]]; // 這里我們只讀取第一張sheet
var csv = XLSX.utils.sheet_to_csv(worksheet);
csv2table(csv);
}
// 將csv轉換成表格
function csv2table(csv) {
var rows = csv.split('\n');
rows.pop(); // 最后一行沒用的
rows.forEach(function(row, idx) {
var columns = row.split(',');
columns.forEach(function(column) {
// 每讀到一個企業名稱就查詢一次,在回調函數中把值附在頁面
mapObj.plugin(["AMap.PlaceSearch"], function() {
var msearch = new AMap.PlaceSearch(); //構造地點查詢類
AMap.event.addListener(msearch, "complete", placeSearch_CallBack1); //查詢成功時的回調函數
msearch.setCity("江蘇"); // 根據自己需要選擇城市
msearch.search(column); //關鍵字查詢查詢
});
});
});
}
// 回調函數 可自行打印data的值,里面有地址,名稱,企業類型等一些數據
function placeSearch_CallBack1(data) {
var poiArr = data.poiList.pois;
//poiArr[0].location.getLng(); //X
//poiArr[0].location.getLat(); //Y
$("#tbody").append('<tr><td>' + poiArr[0].name + '</td><td>' + poiArr[0].location.getLng() + '</td><td>' + poiArr[0].location.getLat() + '</td></tr>');
}
// ------------------------------導出---------------------------------------
function exportExcel() {
// 直接使用js中的方法,非常方便
var sheet = XLSX.utils.table_to_sheet($('table')[0]);
openDownloadDialog(sheet2blob(sheet), '導出.xlsx');
}
// 將一個sheet轉成最終的excel文件的blob對象,然后利用URL.createObjectURL下載
function sheet2blob(sheet, sheetName) {
sheetName = sheetName || 'sheet1';
var workbook = {
SheetNames: [sheetName],
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;
}
/**
* 通用的打開下載對話框方法,沒有測試過具體兼容性
* @param url 下載地址,也可以是一個blob對象,必選
* @param saveName 保存文件名,可選
*/
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);
}
