一、为啥要读取表格
前段时间,运营小姐姐给产品小哥哥抱怨说上新商品(sku,spu)太慢了,都是重复工作,很浪费时间。然后产品小哥哥很给力得出了个批量导入的需求,后端小哥哥又说,接口用之前得就好,你前端全搞了应该是没问题了。然后我就有了这么个需求,管理系统读取运营的表格,然后处理数据,生成SKU,生成SPU再关联对应的SKU。
二、愉快地开发, 愉快地懵逼
经过我一段Google乱CV后,终于是把这破需求搞定了。
但是测试小哥测试的时候无论导入什么类型的表格都没反应(这很明显不是我的问题,我的电脑就可以),然后就发了几个表格给我,我在开发环境导入的时候发现,获取到的数据居然是乱码,像这样的👇(我当时就懵了,咋的测试还会韩文的)
所以定位到的问题就是导入的时候获取的数据编码不是 utf-*的,我这边根本没法往下走(后来我试了很多个表格,发现运营小姐姐们的表格数据编码千奇百怪,很多种!),所以只能去解决这个编码的问题。
三、需要用到的插件
众所周知,nmp是程序员的baidu,所以在一顿搜索后,找到了两个较为合适的插件
- chardet -> 解析数据编码格式
- iconv-lite -> 数据编码格式转换成默认为utf8的编码格式
有了这两个插件,就能很轻松地解决前面的问题了(对了,要在node处理)
最后附上我的处理代码
const Service = require('egg').Service;
const fs = require('fs');
const chardet = require('chardet');
const iconv = require('iconv-lite');
const xlsx = require('xlsx');
class ImportFileService extends Service {
async parseImportFile( filePath ) {
//读取的数据
const fileContent = fs.readFileSync(`${filePath}`)
const codeType = chardet.detect(fileContent);
//解析转换后的数据
const newFileContent = iconv.decode(fileContent, codeType);
const newCodeType = chardet.detect(newFileContent);
//转为string类型
const workbook = xlsx.read(newFileContent, {type: 'string'});
const sheetNames = workbook.SheetNames;
const worksheet = workbook.Sheets[sheetNames[0]];
const sheetJson = xlsx.utils.sheet_to_json(worksheet);
console.log('🍊 oldFileCodeType', codeType)
console.log('👻 newFileCodeType', newCodeType)
return sheetJson;
}
}
module.exports = ImportFileService;
以上~