前两天,有个两DB之间的数据导出导入的需求。对方提供的是excel表,我这边是mysql数据库,excel表第一行是字段名,之后的行是记录的值。
其实没有多复杂,我先将exel转成csv,结果mysql导入csv,第一行记录就没能成功导入,排错起来够折腾的,需要仔细检查每个字段的值,关键是这个表够宽的,果断放弃。
干脆写几行代码读取excel获取数据后,直接添加到mysql数据库里去。
下面是node.js代码,使用node-xlsx读excel文件,使用mysql2对接mysql数据库
//excel2json.js
const 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多条记录,一条插入命令搞定,当然如果记录比较多的话,可以考虑分批插入。