将数据从Excel工作簿导入Node.js中的sqlite3数据库

将数据从Excel工作簿导入Node.js中的sqlite3数据库,node.js,excel,xlsx,node-sqlite3,Node.js,Excel,Xlsx,Node Sqlite3,有一个结构化的excel工作簿,每个工作表上都有uniq名称,每个工作表的第一行包含uniq列名,其余行包含值 有一个解决方案,将每个工作表导出到csv文件,并使用sqlite3。对它们使用import方法(见下文)速度慢,需要付出太多的努力 .mode csv .separator ";" BEGIN TRANSACTION; drop table if exists log; .import "log.csv" log COMIT; 我们希望将数据从

有一个结构化的excel工作簿,每个工作表上都有uniq名称,每个工作表的第一行包含uniq列名,其余行包含值

有一个解决方案,将每个工作表导出到csv文件,并使用sqlite3。对它们使用import方法(见下文)速度慢,需要付出太多的努力

.mode csv
.separator ";"
BEGIN TRANSACTION;
drop table if exists log;
.import "log.csv" log
COMIT;
我们希望将数据从excel导入sqlite3数据库,其中每个工作表都是一个表,工作表的行号是记录集的id。由于第一行包含列名,id=行号-1解决方案:

'use strict';
var   XLSX = require('xlsx');
const sql3 = require('sqlite3').verbose();

var workbook = XLSX.readFile( 'D:\\excel.xlsx' );
var       db = new sql3.Database( 'D:\\database.db' );

var sheet_name_list = workbook.SheetNames; // tables
//console.log( sheet_name_list );
db.serialize( function () {
  db.run( "BEGIN TRANSACTION");
  for( var sheet of workbook.SheetNames ){
    console.log( "Sheet: " + sheet );
    var cells = workbook.Sheets[ sheet ];
    cells['range'] = { R: (cells['!ref']).replace(/[^0-9\:]/g, '' ).split( ':' ),
                       C: (cells['!ref']).replace(/[^A-Z\:]/g, '' ).split( ':' )
                      };
    //console.log( cells );
    var sql = { def: {
                      dro : "DROP TABLE IF EXISTS `$table$`;",
                      cre : "CREATE TABLE `$table$` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT$cres$ );",
                      ins : "INSERT INTO `$table$` ( $columns$ ) VALUES ( $values$ );"
                     },
                cmd: {
                      dro : {},
                      cre : {},
                      ins : {},
                     },
                cols: {},    
                cres: {},    
                vals: {}    
              };
    
    sql.cols[ sheet ] = "";
    sql.cres[ sheet ] = "";
    sql.vals[ sheet ] = [];
    var rowindex = 0;   
    for(var row=cells.range.R[0];row<=cells.range.R[1];row++){
      sql.vals[ sheet ][ rowindex ] = [];
      for(var colindex=XLSX.utils.decode_col( cells.range.C[0] );colindex<=XLSX.utils.decode_col( cells.range.C[1] );colindex++){
        var col  = XLSX.utils.encode_col( colindex );
        var cell = cells[ col + "" + row ].v;
        
        if( row == 1 ) {
        //create table
          sql.cols[ sheet ] += " ,`" + cell + "`";
          sql.cres[ sheet ] += ", `" + cell + "` " + 
                              ( cell * 1.0 == cell ?  ( ( cell * 1 + "" )  == cell ? "INTEGER" : "REAL" ) : "TEXT" );
        } else {
          sql.vals[ sheet ][ rowindex ].push( cell );
          //console.log(sql.vals[ sheet ]);
        }
      }
      if( row==1 ) {
        // drop table
        sql.cmd.dro[ sheet ] = sql.def.dro
                               .replace( "$table$", sheet );
        db.run( sql.cmd.dro[ sheet ] );
        
        // create table
        sql.cmd.cre[ sheet ] = sql.def.cre
                               .replace( "$table$", sheet ) 
                               .replace( "$cres$", sql.cres[ sheet ] );
        db.run( sql.cmd.cre[ sheet ] );
        
        console.log( "Columns: `id`"+ sql.cres[ sheet ] );
        //prepare insert
        sql.cmd.ins[ sheet ] = sql.def.ins
                               .replace( "$table$", sheet ) 
                               .replace( "$columns$", sql.cols[ sheet ].substr( 2 ) )
                               .replace( "$values$",  sql.cols[ sheet ].substr( 2 )
                                                      .replace( /(`[^`]+?`)/g, "?" )
                                        );
        sql.cmd.ins[ sheet ] = db.prepare( sql.cmd.ins[ sheet ] );
      } else {
        //insert prepared values
        console.log( "Row: " + row, "Values: ", sql.vals[ sheet ][ rowindex ] );
        sql.cmd.ins[ sheet ].run( sql.vals[ sheet ][ rowindex++ ] );
      }
    }
    //console.log(sql);
    
    sql.cmd.ins[ sheet ].finalize();
  }
  db.run("COMMIT");
});
“严格使用”;
var XLSX=require('XLSX');
const sql3=require('sqlite3').verbose();
var workbook=XLSX.readFile('D:\\excel.XLSX');
var db=new sql3.Database('D:\\Database.db');
var sheet_name_list=workbook.SheetNames;//桌子
//控制台日志(表格名称列表);
db.serialize(函数(){
db.run(“开始事务”);
用于(工作簿的var工作表。工作表名称){
控制台日志(“工作表:+工作表”);
变量单元格=工作簿.工作表[工作表];
单元格['range']={R:(单元格['!ref'])。替换(/[^0-9\:]/g')。拆分(':'),
C:(单元格['!ref'])。替换(/[^A-Z\:]/g',)。拆分(':'))
};
//控制台日志(单元格);
var sql={def:{
dro:“如果存在`$TABLE$`;`,则删除表”,
cre:“创建表`$TABLE$`(`id`整型主键自动递增$cres$);”,
ins:“插入到`$table$`($columns$)值($VALUES$);”
},
命令:{
dro:{},
cre:{},
ins:{},
},
科尔斯:{},
克雷斯:{},
VAL:{}
};
sql.cols[sheet]=“”;
sql.cres[sheet]=“”;
sql.vals[sheet]=[];
var-rowindex=0;

对于(var row=cells.range.R[0];row最后,我在流程中采用了更好的sqlite。差别很大,转换只需几秒钟,而不是几分钟

'use strict';
var   XLSX = require('xlsx');
const sql3 = require('better-sqlite3');
var workbook = XLSX.readFile( './perform.xlsx' );
var       db = new sql3( './perform.db' );

var sheet_name_list = workbook.SheetNames; // tables
  
  for( var sheet of workbook.SheetNames ){
    console.log( "Sheet: " + sheet );
    var cells = workbook.Sheets[ sheet ];
    cells['range'] = { R: (cells['!ref']).replace(/[^0-9\:]/g, '' ).split( ':' ),
                       C: (cells['!ref']).replace(/[^A-Z\:]/g, '' ).split( ':' )
                      };
    //console.log( cells );
    var sql = { def: {
                      dro : "DROP TABLE IF EXISTS `$table$`;",
                      cre : "CREATE TABLE `$table$` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT$cres$ );",
                      ins : "INSERT INTO `$table$` ( $columns$ ) VALUES ( $values$ );"
                     },
                cmd: {
                      dro : {},
                      cre : {},
                      ins : {},
                     },
                cols: {},    
                cres: {},    
                vals: {}    
              };
    
    sql.cols[ sheet ] = "";
    sql.cres[ sheet ] = "";
    sql.vals[ sheet ] = [];
    var rowindex = 0;   
    for(var row=cells.range.R[0];row<=cells.range.R[1];row++){
      sql.vals[ sheet ][ rowindex ] = [];
      for(var colindex=XLSX.utils.decode_col( cells.range.C[0] );colindex<=XLSX.utils.decode_col( cells.range.C[1] );colindex++){
        var col  = XLSX.utils.encode_col( colindex );
        var cell = ( typeof cells[ col + "" + row ] != "undefined") ? cells[ col + "" + row ].v : "";
        
        if( row == 1 ) {
        //create table
          sql.cols[ sheet ] += " ,`" + cell + "`";
          sql.cres[ sheet ] += ", `" + cell + "` " + 
                              ( cell * 1.0 == cell ?  ( ( cell * 1 + "" )  == cell ? "INTEGER" : "REAL" ) : "TEXT" );
        } else {
          sql.vals[ sheet ][ rowindex ].push( cell + "");
          //console.log(sql.vals[ sheet ]);
        }
      }
      if( row==1 ) {
        // drop table
        sql.cmd.dro[ sheet ] = sql.def.dro
                               .replace( "$table$", sheet );
        db.exec( sql.cmd.dro[ sheet ] );
        
        // create table
        sql.cmd.cre[ sheet ] = sql.def.cre
                               .replace( "$table$", sheet ) 
                               .replace( "$cres$", sql.cres[ sheet ] );
        db.exec( sql.cmd.cre[ sheet ] );
        
        console.log( "Columns: `id`"+ sql.cres[ sheet ] );
        //prepare insert
        sql.cmd.ins[ sheet ] = sql.def.ins
                               .replace( "$table$", sheet ) 
                               .replace( "$columns$", sql.cols[ sheet ].substr( 2 ) )
                               .replace( "$values$",  sql.cols[ sheet ].substr( 2 )
                                                      .replace( /(`[^`]+?`)/g, "?" )
                                        );
        sql.cmd.ins[ sheet ] = db.prepare( sql.cmd.ins[ sheet ] );
      } else {
        //insert prepared values
        console.log( "Row: " + row, "Values: ", sql.vals[ sheet ][ rowindex ] );
        sql.cmd.ins[ sheet ].run( sql.vals[ sheet ][ rowindex++ ] );
      }
    }
  }
db.close();
“严格使用”;
var XLSX=require('XLSX');
const sql3=require('better-sqlite3');
var workbook=XLSX.readFile('./perform.XLSX');
var db=newsql3('./perform.db');
var sheet_name_list=workbook.SheetNames;//表
用于(工作簿的var工作表。工作表名称){
控制台日志(“工作表:+工作表”);
变量单元格=工作簿.工作表[工作表];
单元格['range']={R:(单元格['!ref'])。替换(/[^0-9\:]/g')。拆分(':'),
C:(单元格['!ref'])。替换(/[^A-Z\:]/g',)。拆分(':'))
};
//控制台日志(单元格);
var sql={def:{
dro:“如果存在`$TABLE$`;`,则删除表”,
cre:“创建表`$TABLE$`(`id`整型主键自动递增$cres$);”,
ins:“插入到`$table$`($columns$)值($VALUES$);”
},
命令:{
dro:{},
cre:{},
ins:{},
},
科尔斯:{},
克雷斯:{},
VAL:{}
};
sql.cols[sheet]=“”;
sql.cres[sheet]=“”;
sql.vals[sheet]=[];
var-rowindex=0;
for(var行=cells.range.R[0];行