上次完成了通过SheetJS读取excel中数据并转为Json数组对象传递到后端实现批量导入功能。但是遗留下一个问题,就是表中的表头使用的是英文,非常的不方便,于是这次进行了改进。
导入的代码就不写了。主要是一个中英文转换的代码
既然要进行转换的是表头,想法是转换json数组对象,然后对json数组对象进行操作。在读到一个Sheet,并通过 XLSX.utils.sheet_to_json
转为json对象之后进行转换
核心代码如下:
weldmachine = XLSX.utils.sheet_to_json(workbook.Sheets[sheet], { range: 1 });
//中英文映射
var columnMapping = {
'设备编号': 'machineNo',
'设备品牌': 'machineBrand',
'技术参数': 'techParams',
'备注': 'comment'
};
//string类型
var jsonArrary = JSON.stringify(weldmachine); //是从一个对象中解析出字符串
//object类型
var excel = JSON.parse(jsonArrary); //用于将一个 JSON 字符串转换为对象
var newrows = [];
//中英文转换
weldmachine.forEach(function (row) {
var newRow = {};
Object.keys(row).forEach(function (key) {
//要是能在colmnMapping[key]中找到对应的英文,则变成对应的数据,否则还是用原来的
newRow[columnMapping[key] || key] = row[key];
})
return newrows.push(newRow);
});
这里详细讲解一下newRow[columnMapping[key] || key] = row[key];
nameMap
是一个包含中英文属性名映射关系的对象,例如{ '姓名': 'name', '年龄': 'age', '性别': 'gender' }
。key
是当前遍历到的属性名。nameMap[key]
表示将key
在nameMap
对象中查找对应的英文属性名,如果找到了,那么返回这个英文属性名,否则返回undefined
。||
表示逻辑或运算符,它的优先级比赋值运算符低。当nameMap[key]
返回undefined
时,逻辑或运算符会返回key
。newRow[nameMap[key] || key]
表示将转换后的英文属性名或原属性名作为newRow
对象的属性名。row[key]
表示获取row
对象中当前属性名对应的属性值。=
表示赋值运算符,将row[key]
的值赋给newRow[nameMap[key] || key]
。
因此,这个语句的作用是将 row
对象中的属性名从中文转换为英文,并将转换后的属性名和属性值存储在 newRow
对象中。如果属性名没有在 nameMap
对象中找到对应的英文属性名,那么将使用原属性名作为英文属性名。
这里需要将转为英文后的数据保存到一个新的数组里,所以有newrows[]
,否则下次读取就会覆盖掉newRow[ ]
实际读取的数据:
想要传递到后端的数据(转换后):
将newRow序列化之后,通过ajax请求向后端发送数据,后端进行反序列化后做响应处理即可。
最后是成功导入。
如果有更好的方法,欢迎大佬提出!!!!