Commit 0a78a9ca authored by Carver_Hu's avatar Carver_Hu

完善excel导入脚本

parent 331ec9b7
var query = ...
query.begin()
try {
query.insertRow({
table: '',
data: {}
})
if (query.lastError().isValid()) throw query.lastError().text()
}
catch(e) {
}
\ No newline at end of file
...@@ -34,6 +34,7 @@ db.addConnection({ ...@@ -34,6 +34,7 @@ db.addConnection({
var filed_list = db.query("MES_DB", function(query) { var filed_list = db.query("MES_DB", function(query) {
return query.getFieldList('sec_production_order_confirmation_1'); return query.getFieldList('sec_production_order_confirmation_1');
}); });
cl.log('获取字段列表:' + filed_list);
// 查询当前数据库表中是否存在数据 // 查询当前数据库表中是否存在数据
var check_data_empty = db.query("MES_DB", function(query) { var check_data_empty = db.query("MES_DB", function(query) {
...@@ -56,7 +57,6 @@ var get_data = db.query("MES_DB", function(query) { ...@@ -56,7 +57,6 @@ var get_data = db.query("MES_DB", function(query) {
}); });
}); });
//查询
data_length = get_data.length data_length = get_data.length
cl.log('当前数据库表已存在行数:' + data_length); cl.log('当前数据库表已存在行数:' + data_length);
......
var fs = require('fs');
var cl = require('console');
var book = require('topsin.excelxs');
var config = {
'file_address': './',
'match_field_address': './match_field.json'
};
//自定义地址
var file_collect_address = config['file_address'] + 'file_collection/';
var have_read_address = file_collect_address + 'have_read/';
var unread_address = file_collect_address + 'unread/';
//判断是否存在自定义文件夹(用于复制导入的excel文件)
var check_file_adress = function(){
// cl.log('文件目录检测...');
if(fs.dirExists(file_collect_address) == false){
fs.mkdir(file_collect_address);
};
if(fs.dirExists(have_read_address) == false){
fs.mkdir(have_read_address);
};
if(fs.dirExists(unread_address) == false){
fs.mkdir(unread_address);
};
};
//获取文件列表
var get_read_list = function(address){
var file_info_list = fs.listDir(address, 1);
var file_list = [];
file_info_list.forEach(function(item){
file_list.push(item['baseName']);
});
return file_list;
};
//将所有新导入的文件复制到未读文件夹中(如果所有文件被意外删除,不需要判断哪个是过往的已读文件,在数据库层面操作略过即可)
var copy_new_file = function(excel_file_list, have_read_list){
var confir_list = []
excel_file_list.forEach(function(item){
if(item.search('confirmation') != -1){
confir_list.push(item);
};
});
confir_list.forEach(function(item){
if(have_read_list.indexOf(item) == -1){
////判断文件在已读目录中是否存在,若存在就复制到未读目录中
fs.copyFile(config['file_address'] + item + '.XLSX', unread_address + item + '.XLSX', true);
};
});
};
//移动文件至已读路径
function move_file_to_read(path){
arr = path.split('unread');
read_path = arr.join('have_read');
fs.rename(path, read_path);
};
//补加路径后缀
var path_add = function(unread_list){
var path_list = [];
unread_list.forEach(function(item){
var unread_path = unread_address +item + '.XLSX';
path_list.push(unread_path);
});
return path_list;
};
//对年月日进行格式化处理
function formatDate(numb, format) {
if (numb != undefined) {
var time = new Date((numb - 1) * 24 * 3600000 + 1)
time.setYear(time.getFullYear() - 70)
var year = time.getFullYear() + ''
var month = time.getMonth() + 1 + ''
var date = time.getDate() + ''
if (format && format.length === 1) {
return year + format + (month < 10 ? '0' + month : month) + format + (date < 10 ? '0' + date : date)
}
return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
} else {
return undefined;
}
}
//对时分秒进行格式化处理
function formatTime(numb, format) {
var hourTmp = numb * 24;
var hour = Math.floor(hourTmp);
var minuteTmp = hourTmp - hour;
var minute = Math.floor(minuteTmp * 60);
var secondTmp = (minuteTmp * 60) - minute;
var second = Math.round(secondTmp * 60);
if(second == 60){
second = 0;
minute = minute + 1;
};
if(minute == 60){ //excel 329行 和 第442行
minute = 0;
hour = hour + 1;
}
return (hour < 10 ? '0' + hour : hour) + format + (minute < 10 ? '0' + minute : minute) + format + (second < 10 ? '0' + second : second);
}
//提取excel表数据
var get_range_table = function(path){
try {
var table_data = [];
book.open(path);
//获取当前表
var sheet = book.getActiveSheet();
//当前表总列数
var count_col = sheet.getLastCol();
// cl.log(count_col);
//当前表总行数
var count_row = sheet.getLastRow();
//提取第一行数据
var first_row_data = [];
for(var k=0; k<count_col; k++){
first_row_data.push(sheet.getCellValue(0, k));
};
//判断生成时间和 确认时间的列的索引位置
var posting_date_index = 0;
var entry_time_index = 0;
first_row_data.forEach(function(item, index){
//模糊匹配不严谨,后面记得改
if(item.search('Posting Date') != -1 || item.search('生产时间') != -1){
posting_date_index = index;
};
if(item.search('Confirmation Entry Time') != -1 || item.search('确认时间') != -1){
entry_time_index = index;
};
});
//表数据写入数组
for(var i=0; i<count_row; i++){
var arry = [];
for(var j=0; j<count_col; j++){
//注意:如果列被改变,那么要考虑下方需要转变时间格式的对两列到底是不是日期格式的那两列!
if(i != 0 && j == posting_date_index){
arry.push(formatDate(sheet.getCellValue(i, j), '-'));
}else if(i != 0 && j == entry_time_index){
arry.push(formatTime(sheet.getCellValue(i, j), ':'));
}else{
arry.push(sheet.getCellValue(i, j));
};
};
table_data.push(arry);
};
book.close();
return table_data;
} catch (error) {
cl.log(error);
};
};
//数据库连接
var db = require('topsin.database');
db.addConnection({
database_type:'pg',
database_host:'139.196.104.13:5433',
database_name:'PMO_TRAINING',
database_user:'toplinker',
database_pwd:'TopLinker0510'
}, "MES_DB");
//获取数据库操作对象
var query = db.query('MES_DB');
//提取数据库当前表字段
var get_field_list = function(query){
//事务
query.begin();
try {
var field_list = query.getFieldList('sec_production_order_confirmation_1');
//此处lastError报错
// if (query.lastError().isValid()){
// throw query.lastError().text();
// }
query.commit();
}
catch (error) {
query.rollback();
};
return field_list;
};
//提取数据库中指定数据
function get_database_data(field_select){
//事务
query.begin();
try {
var data = query.selectArrayMap({
table:'sec_production_order_confirmation_1',
field: field_select,
// field: 'confirmation_entry_time',
field_format:{"tags":'array', attr_data:'json'}
});
//此处lastError报错
// if (query.lastError().isValid()){
// throw query.lastError().text();
// }
query.commit();
}
catch (error) {
query.rollback();
};
return data;
};
//批量插入数据
function batchInsert(iData, new_field_list){
//事务
query.begin();
try {
query.batchInsert(
'sec_production_order_confirmation_1',
new_field_list,
iData
);
//此处lastError报错
// if (query.lastError().isValid()){
// throw query.lastError().text();
// }
query.commit();
}
catch (error) {
cl.log('批量插入数据报错:' + error);
query.rollback();
};
};
//更新数据
function updateRow(update_data){
iData = update_data['iData'];
iWhere = update_data['iWhere'];
//事务
query.begin();
try {
query.updateRow({
table:'sec_production_order_confirmation_1',
data: iData,
where:iWhere,
update_policy:{tags:'array_append', attr_data:'json_merge'}
});
//此处lastError报错
// if (query.lastError().isValid()){
// throw query.lastError().text();
// }
query.commit();
}
catch (error) {
cl.log('更新数据报错:' + error);
query.rollback();
};
};
//对象value值拼接
function get_value_splice(obj, new_field_list){
var str = '';
new_field_list.forEach(function(item){
str = str + obj[item];
});
return str;
};
//检查是否需要更新
function check_update(insert_data, database_data, other_field){
var obj = {};
other_field.forEach(function(item){
if(insert_data[item] != database_data[item]){
obj[item] = insert_data[item];
};
});
return obj;
};
//获取主键数据
function get_primary_data(data ,primary_field){
var obj = {};
primary_field.forEach(function(item){
obj[item] = data[item];
});
return obj;
};
//数据入库操作
function data_insert(iData, database_data, new_field_list){
//判断函数是否走通
var flag = 0
//主键:confirmation plant material posting_date confirmation_entry_time activity
var primary_field = ['confirmation', 'plant', 'material', 'posting_date', 'confirmation_entry_time', 'activity']
//除去主键外的其他字段
var other_field = [];
new_field_list.forEach(function(item){
if(primary_field.indexOf(item) == -1){
other_field.push(item);
};
});
cl.log('当前数据库表中已存在数据:' + database_data.length + '条');
if(database_data.length == 0){
// 首次批量插入数据
batchInsert(iData, new_field_list);
}else{
//待批量插入数据
var batch_insert_iData = [];
//待更新数据
var update_data = [];
//主键对应值拼接(用于比对插入数据是否重复)
var arr_primary = [];
database_data.forEach(function(item){
arr_primary.push(get_value_splice(item, primary_field));
});
iData.forEach(function(item){
//待插入数据的主键值拼接
var item_primary_splice = get_value_splice(item, primary_field);
var db_index = arr_primary.indexOf(item_primary_splice);
if(db_index > -1){
//是重复数据就判断是否需要更新
var update_obj = check_update(item, database_data[db_index], other_field);
if(Object.keys(update_obj).length > 0){
//存在更新数据
var update_info = {};
update_info['iData'] = update_obj;
update_info['iWhere'] = get_primary_data(item, primary_field);
update_data.push(update_info);
};
}else{
//不是重复数据就直接插入
batch_insert_iData.push(item);
};
});
if(update_data.length != 0){
update_data.forEach(function(item){
updateRow(item);
});
cl.log('本次导入共更新数据:' + update_data.length + '条');
cl.log('更新数据如下:');
update_data.forEach(function(item){
cl.log(item);
});
}else{
cl.log('本次导入没有更新数据');
};
if(batch_insert_iData.length != 0){
batchInsert(batch_insert_iData, new_field_list);
cl.log('本次共导入新增数据:' + batch_insert_iData.length + '条');
// cl.log('插入数据如下:');
// batch_insert_iData.forEach(function(item){
// cl.log(item);
// });
}else{
cl.log('本次导入没有新增数据');
};
};
return flag;
};
//生成json文件(仅在第一次导入excel时初始化创建json文件)
function make_json_file(field_list, range_table_data){
var use_field_list = field_list.slice(1, 20);
var obj = {};
range_table_data[0].forEach(function(item, index){
obj[use_field_list[index]] = item
});
//反序列化
var load_data = JSON.stringify(obj);
var file = fs.openFile(config['match_field_address'], 'w');
file.write(load_data);
file.close();
};
//获取json文件数据
var get_field_json = function(){
var file = fs.openFile(config['match_field_address']);
var data = file.readAll();
var json_obj = JSON.parse(data);
// cl.log(typeof json_obj);
// Object.keys(json_obj).forEach(function(item){
// cl.log(json_obj[item]);
// });
return json_obj;
};
// 列名解析成合适的字段名(根据之前的列名来判断)
function col_parse(col_name){
var str = '';
if(col_name.indexOf('\n') != -1){
str = col_name.trim().split('\n')[0];
};
str = str.trim().toLowerCase();
str_arr = str.split(' ');
var arr = [];
str_arr.forEach(function(item){
if(item != '' && item[0] != '(' && item[-1] != ')'){
arr.push(item.trim());
};
});
cl.log(arr)
str = arr.join('_');
str = str.split('.').join('_');
return str;
};
//新增字段
function add_filed(new_filed_name){
query.begin();
try {
query.execSql('alter table sec_production_order_confirmation_1 add ' + new_filed_name + ' char(64);');
//此处lastError报错
// if (query.lastError().isValid()){
// throw query.lastError().text();
// }
query.commit();
}
catch (error) {
cl.log('新增字段报错:' + error);
query.rollback();
};
};
//向json文件中更新新增字段与列名的配对关系
function json_field_update(new_filed_name, col_name){
var json_obj = get_field_json();
json_obj[new_filed_name] = col_name;
//写入json文件
var load_data = JSON.stringify(json_obj);
var file = fs.openFile(config['match_field_address'], 'w');
file.write(load_data);
file.close();
};
//excel的列名与数据库表字段关系约束
function match_field(col_name_list){
var field_json_data = get_field_json();
// cl.log(Object.keys(field_json_data));
var field_key_list = Object.keys(field_json_data);
var field_value_list = [];
//提取json文件中的value值
field_key_list.forEach(function(item){
field_value_list.push(field_json_data[item]);
});
//提取新增字段
var new_insert_field = []
col_name_list.forEach(function(item){
if(field_value_list.indexOf(item) == -1){
new_insert_field.push(item);
};
});
if(new_insert_field.length == 0){
cl.log('本次导入excel没有新增列');
}else{
cl.log('本次导入excel存在新增列:' + new_insert_field);
//若有新增列,对其进行格式化字段处理,并在数据库表中新增该字段,同时将匹配关系其更新到json文件中
//注意:要先保证数据库字段新建成功
new_insert_field.forEach(function(item){
//列名解析成合适的字段名
var col_name = col_parse(item);
//数据库新增字段
var new_filed_name = 'Attr_' + col_name
add_filed(new_filed_name);
//向json文件中更新新增字段与列名的配对关系
json_field_update(new_filed_name, item);
});
};
};
//excel表数据入库格式拼接
var get_format_data = function(data){
var batch_data = [];
//得到excel第一行列名
var col_name_list = data[0];
//excel的列名与数据库表字段匹配关系约束
match_field(col_name_list);
//字段匹配完成后获取文件后的字段key
var new_field_json_data = get_field_json();
var new_field_key_list = Object.keys(new_field_json_data);
// cl.log(new_field_key_list)
var new_value_list = [];
//提取更新后文件字段key对应的value值
new_field_key_list.forEach(function(item){
new_value_list.push(new_field_json_data[item]);
});
// cl.log(new_value_list);
//处理批量插入的数据格式
data.slice(1).forEach(function(item1){
var obj = {};
item1.forEach(function(item2, index){
//通过取字段对应列名的实际索引来得到实际value值
obj[new_field_key_list[index]] = item1[col_name_list.indexOf(new_value_list[index])];
});
batch_data.push(obj);
});
return batch_data;
};
//================================running=====================================
//检测目录
check_file_adress();
//获取excel文件列表
var excel_file_list = get_read_list(config['file_address']);
//获取已读文件列表
var have_read_list = get_read_list(have_read_address);
cl.log('已读目录:' + have_read_list);
//将所有新导入的文件复制到未读文件夹中
copy_new_file(excel_file_list, have_read_list);
//获取未读文件列表
var unread_list = get_read_list(unread_address);
cl.log('未读目录:' + unread_list);
//提取数据库当前表字段
//问题:此处是通过截取来提取数据库字段,然后与第一个excel列表中的列名相对应,是默认初始字段与列名是对应的
var field_list = get_field_list(query);
//若未读目录为空,说明没有新的excel文件被导入,则不需要再往下执行代码
if(unread_list.length == 0){
cl.log('暂无待导入的excel文件...');
}else{
//补全未读文件路径列表
var unread_path_list = path_add(unread_list);
//等待扩展:关注高频运作情况下的阻塞问题,必须是一个文件或数据库读取完毕结束后才能读取下一个!
for(var i=0; i<unread_path_list.length; i++){
cl.log('正在导入文件' + unread_path_list[i]);
//取出当前excel表所有数据
var range_table_data = get_range_table(unread_path_list[i]);
//生成json文件(仅在第一次导入excel时初始化创建json文件)
//注释下方函数后再执行(因为要得到第一个excel文件的字段信息,所以放在循环内)
// make_json_file(field_list, range_table_data);
//excel表数据入库格式拼接
var iData = get_format_data(range_table_data);
//提取数据库中所有数据
var database_data = get_database_data('*');
//重新提取表字段(从文件中提取最新的表字段)
var new_field_list = Object.keys(get_field_json());
//数据插入操作
var flag = data_insert(iData, database_data, new_field_list);
//删除数据存在删除数据后id不从1开始自增长的现象
//解决:使用sql语句 truncate table "sec_production_order_confirmation_1" RESTART IDENTITY;
if(flag == 0){
//说明上述操作都执行成功,移动该文件至已读文件夹
move_file_to_read(unread_path_list[i]);
cl.log('文件导入完毕,移动文件' + unread_path_list[i] + '至已读文件夹');
};
};
};
//移除数据库连接
db.removeConnection('MES_DB');
\ No newline at end of file
{"order_no":"Order\n生管投料单号","confirmation":"Confirmation\n总数量","plant":"Plant\n厂别","material":"Material\n批号","material_description":"Material Description\n批次说明","posting_date":"Posting Date\n生产时间","confirmation_entry_time":"Confirmation Entry Time\n确认时间","activity":"Activity","work_center":"Work Center\n生产站别","confirmed_yield":"Confirmed Yield (GMEIN)","base_unit":"Base Unit of Measure (=GMEIN)","confirmed_scrap":"Confirmed scrap (MEINH)\n报废数量","reason_for_variance":"Reason for Variance\n报废代码","rework":"Rework\n重工数量","confirmation_text":"Confirmation text","entered_by_user":"Entered by User","ind_final_confirmation":"Ind.Final Confirmation","milestone_confirmed":"Milestone confirmed","ind_delete_doc":"Ind. delete doc."}
\ No newline at end of file
{"order_no":"Order\n生管投料单号","confirmation":"Confirmation\n总数量","plant":"Plant\n厂别","material":"Material\n批号","material_description":"Material Description\n批次说明","posting_date":"Posting Date\n生产时间","confirmation_entry_time":"Confirmation Entry Time\n确认时间","activity":"Activity","work_center":"Work Center\n生产站别","confirmed_yield":"Confirmed Yield (GMEIN)","base_unit":"Base Unit of Measure (=GMEIN)","confirmed_scrap":"Confirmed scrap (MEINH)\n报废数量","reason_for_variance":"Reason for Variance\n报废代码","rework":"Rework\n重工数量","confirmation_text":"Confirmation text","entered_by_user":"Entered by User","ind_final_confirmation":"Ind.Final Confirmation","milestone_confirmed":"Milestone confirmed","ind_delete_doc":"Ind. delete doc."}
\ No newline at end of file
var fs = require('fs');
var cl = require('console');
var _ = require('lodash');
var crypto = require('topsin.crypto');
// var filelist = fs.listDir('./', 1);
// print('当前共有文件个数:' + filelist.length);
// //查看当前目录下的文件
// var get_current_files = function(){
// var current_files = [];
// for(var i=0; i<filelist.length; i++){
// current_files.push(_.toString(filelist[i]['baseName']));
// };
// return current_files;
// }
// var current_files = get_current_files();
// cl.log(current_files);
// //查看所有的csv文件
// var get_confirmation_files = function(current_files){
// var confirmation_file = [];
// current_files.forEach(function(item){
// if(item.search('confirmation') != -1){
// confirmation_file.push(item);
// }
// });
// return confirmation_file;
// }
// var confirmation_files = get_confirmation_files(current_files);
// cl.log(confirmation_files);
// //使用md5标记一个文件被查看过多少次
// var file_check = function(current_files){
// //查看当前是否存在csv_data.json文件,如果有就读取,没有就创建
// // if(current_files.indexOf('csv_data') == -1){
// // cl.log('不存在文件csv_data');
// // };
// //cav_data初始化
// if(fs.fileExists('./csv_data.json') == false){
// cl.log('不存在文件csv_data');
// }
// };
// file_check(current_files);
// a = [1, 2, 3, 4];
// b = [1, 2, 3, 4];
// if(
// a[0] == b[0] &&
// a[1] == b[1] &&
// a[2] == b[2] &&
// a[3] == b[3]
// ){
// cl.log('有重复数据');
// }else{
// cl.log('没有重复数据');
// };
// s = {'name':'huzhihui', 'age':23}
// var str = '';
// Object.keys(s).forEach(function(item){
// str += s[item];
// });
// cl.log(str);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment