前兩天,有個兩DB之間的數據導出導入的需求。對方提供的是excel表,我這邊是mysql數據庫,excel表第一行是字段名,之后的行是記錄的值。
其實沒有多復雜,我先將exel轉成csv,結果mysql導入csv,第一行記錄就沒能成功導入,排錯起來夠折騰的,需要仔細檢查每個字段的值,關鍵是這個表夠寬的,果斷放棄。
干脆寫幾行代碼讀取excel獲取數據后,直接添加到mysql數據庫里去。
下面是node.js代碼,使用node-xlsx讀excel文件,使用mysql2對接mysql數據庫
//excel2json.jsconst xlsx = require("node-xlsx");const mysql = require("mysql2/promise"); const localpool= mysql.createPool({host:"127.0.0.1",port:3306,user:"demouser",password:"XXXXXX",database:"demodb",jsonStrings: true,waitForConnections: true,connectionLimit: 4,enableKeepAlive: true, keepAliveInitialDelay: 5000,});let excelfile=process.argv.slice(2)[0];
let workbook =xlsx.parse(excelfile);
datalist=workbook[0].data;let jlist=[];for (i=1;i<datalist.length;i++){jitem=[];for (j=0;j<datalist[0].length;j++) jitem.push(datalist[i][j]||"");jlist.push(jitem);}let addrecs = "insert into demodb.demotable("+datalist[0].join()+") values ?" ;localpool.query(addrecs,[jlist]).then(([results])=>{ console.log(results); }).catch(err=>{console.log(err);});
600多條記錄,一條插入命令搞定,當然如果記錄比較多的話,可以考慮分批插入。