将数据从Excel工作簿导入Node.js中的sqlite3数据库
有一个结构化的excel工作簿,每个工作表上都有uniq名称,每个工作表的第一行包含uniq列名,其余行包含值 有一个解决方案,将每个工作表导出到csv文件,并使用sqlite3。对它们使用import方法(见下文)速度慢,需要付出太多的努力将数据从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; 我们希望将数据从
.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];行