记录一下用nodejs 实现批量Excel转换csv文件遇到的坑
最近有一个将excel文件批量转换为csv文件的需求,想着用nodejs来处理,然后在npm中找到一个库xlsx
安装一下库
npm install xlsx
这个库使用还是非常方便的,但是当我转换一个文件为csv时,发现他会将大写ID字段自动加上"“,变成"ID”,小写id就不会,这就很蛋疼。找了一下他的API使用说明也没有找到是啥原因,最后只能自己分割一下,手动转换"ID"为ID
还有一个转换UTF-8 BOM格式的问题,在网上找到了解决方法,只要在转换后的csv数据前面加上这个就行了’\uFEFF’
核心代码如下:
const xlsx = require('xlsx');
const fs = require('fs');
const config = require('./build.json') // 这里自己配置一下路径文件
const excal_dir = config.excel; // Excel源目录
const csv_dir = config.csv; // 输出的csv目录
// 遍历目录得到文件信息
function walk(path, callback) {
let files = fs.readdirSync(path);
files.forEach(function (file) {
if (fs.statSync(path + '\\' + file).isDirectory()) {
walk(path + '\\' + file, callback)
} else if (fs.statSync(path + '\\' + file).isFile()) {
callback(path, file);
}
});
}
// 删除文件夹包括下面所有文件
function deleteFolder(path) {
let files = [];
if (fs.existsSync(path)) {
if (fs.statSync(path).isDirectory()) {
files = fs.readdirSync(path);
files.forEach(function (file) {
let dirPath = path + "\\" + file;
if (fs.statSync(dirPath).isDirectory()) {
deleteFolder(dirPath);
} else {
fs.unlinkSync(dirPath);
}
});
fs.rmdirSync(path);
} else {
fs.unlinkSync(path);
}
}
}
// 开始excel转换csv
function xlsxToCsv() {
walk(excal_dir, function (path, file) {
let fileName = file.match(/(\S+)(\.\S+)$/)[1]; // 获得文件名
let newFileName = fileName.split('-')[0] // 这里将文件名字分割了一下
let oldPath = path + '\\' + file // 原路径
let newPath = csv_dir + '\\' + newFileName + '.csv'; // 新路径
// 读取 Excel 文件
const workbook = xlsx.readFile(oldPath);
// 获取第一个工作表
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
// 将工作表转换为 CSV 数据
let csvData = xlsx.utils.sheet_to_csv(worksheet);
let datas = csvData.split('\n')
// 这里大写的ID会自动加上"",去掉一下
let datas = csvData.split('\n')
if (datas[0].includes(`"ID"`)) {
csvData = csvData.replace(/"ID"/, "ID")
}
let bomData = '\uFEFF'; // 加上这个 设置为UTF-8 BOM格式
bomData += csvData
// 将 CSV 数据写入文件
fs.writeFileSync(newPath, bomData);
console.log('转换成功>>>>> 源文件:', oldPath, '新文件:', newPath)
});
}
function start() {
console.log('\x1B[36m配置信息 >>>>>>>>>:\x1B[0m\n', config)
if (!fs.existsSync(csv_dir)) {
fs.mkdirSync(csv_dir);
fs.mkdirSync(csv_dir + '\\server_cross');
}
console.log('\x1B[36m开始转换 excel 到 csv >>>>>>>>>>>>>>\x1B[0m\n')
xlsxToCsv()
console.log('\x1B[36m转换完成 >>>>>>>>>>>>>>\x1B[0m\n')
}
start();
在加一个csv转换为Excel的代码:
// 需要使用到这个库
const csv = require('csvtojson');
async function redJson(oldPath,newPath) {
// 读取文件并转换为json对象
const jsonObj = await csv({ ignoreEmpty: true }).fromFile(oldPath)
// 将 JSON 数据写入到 Excel 文件中
const ws = xlsx.utils.json_to_sheet(jsonObj);
const wb = xlsx.utils.book_new();
xlsx.utils.book_append_sheet(wb, ws, 'Sheet1');
xlsx.writeFile(wb, newPath);
}