在MySQL中保存来自excel的巨大数据集,不保存所有行

时间:2017-02-15 13:13:03

标签: mysql node.js excel

我的excel文件中有大约20000行(从另一个基于数据库的工具导出),我想保存在我的数据库中。

if(typeof require !== 'undefined') XLSX = require('xlsx');

var xlsx = "tmp8704.xlsx";
var url = "extFiles/"+xlsx;
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";
var dataXLS;

oReq.onload = function(e) {
var arraybuffer = oReq.response;

/* convert data to binary string */
var data = new Uint8Array(arraybuffer);
var arr = new Array();

for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
var bstr = arr.join("");

/* Call XLSX */
var workbook = XLSX.read(bstr, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
/* Get worksheet */
var worksheet = workbook.Sheets[first_sheet_name];

dataXLS = XLSX.utils.sheet_to_json(worksheet, {header:1});

var mysql = require("mysql");

var connection = mysql.createConnection({
  host: 'xxx.xxx.xxx.xxx',
  user: 'muser',
  password: 'massword',
  database: 'matabase'
});

connection.connect((err) => {
if(err) {
  return console.log(err.stack);
}
console.log("Connection succesfully established");
});

for(var x in dataXLS){
  if(parseInt(x)+2 != dataXLS.length) {

      var myNumber = dataXLS[parseInt(x)+2][6];
      console.log("Stelle " + x + " :" + dataXLS[parseInt(x)+2][0] + " " + dataXLS[parseInt(x)+2][1] + " " + parseFloat(myNumber));

      $queryString = "INSERT INTO `articles` (articleno,text,price) VALUES ("+parseInt(dataXLS[parseInt(x)+2][0])+",'"+dataXLS[parseInt(x)+2][1]+"',"+parseFloat(myNumber)+");";


      connection.query($queryString, (err, rows, fields) => {
        if(err) {
          return console.log("An error ocurred with the query", err);
        }
      });

  } else {
    console.log(parseInt(x)+2);
    console.log(dataXLS.length); //19610
    break;
  }
}

connection.end(() => {
  console.log("Connection successfully closed");
});
}

oReq.send();

第一个问题:它是在我的表中保存数据,但只是一次又一次,而不是全部。为什么呢?

第二个问题:有更有效的方法吗?

2 个答案:

答案 0 :(得分:0)

当我必须将大型Excel工作表导出到MySQL时,我使用了this website。您必须将您的Excel文件导出为csv并稍微调整网站上的设置,但我发现它快速可靠。

答案 1 :(得分:0)

您可以在Excel中实现一个VBA宏,它为Excel工作表中的所有数据创建一组插入语句。或者,如果您不想使用宏,只需定义一个新的Excel工作表,您可以在其中定义一个简单的公式,例如

=CONCAT("INSERT INTO xxx (a,b,c) values (";Sheet2!A1;", ";Sheet2!A2);")")

在工作表1上为您在工作表2上粘贴的所有数据创建插入语句

(取决于数据类型,您必须在数据列周围添加'插入一些数据类型转换,...​​)

然后将所有20000行的公式复制下来,并获得20000个插入语句。或者,您可以在需要更新现有记录时将其更改为更新语句。