记录一下用nodejs 实现批量Excel转换csv文件遇到的坑

记录一下用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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值