SlimeSpace

Nodejs+ExcelJs,csv文件读写踩坑

1.读取文件后中文乱码

//使用fs,解码,曲线救国
 //以下是曲线保证编码正确的,日后改善逻辑
vcsvStream = fs.createReadStream(global.filepath[0] ,{ encoding: 'binary' });
let data = '';
// csvStream.setEncoding('utf8');
csvStream.on('data', item => {
    data += item;
});
csvStream.on("end", () => {
    const buf = Buffer.from(data, "binary");
    const str = iconv.decode(buf, "GBK"); // 得到正常的字符串,没有乱码
    // console.log(str);
    //重新写入文件后进行上传

    try{
        fs.writeFileSync("temp.csv", str, ["GBK"]);
    } catch(error) {
        console.log("fail " + error);
        global.loginwindow.webContents.send("startChange-reply","临时文件创建失败");
    }
});

2. 使异步函数同步读取

const excelExport = async (form) => {
const workbook = new Excel.Workbook();

    
console.log("是否存在tempcsv",fs.existsSync("temp.csv"));
const worksheet = await workbook.csv.readFile("temp.csv");
let nowCol = form.startX;
while(nowCol != getNext(form.endX)){
    var StartCol = worksheet.getColumn(nowCol);
    StartCol.eachCell(function(cell, rowNumber) {
        if(rowNumber>=form.startY && rowNumber<=form.endY ){
            console.log(rowNumber);
            try {
                if(form.sp1 != form.sp2){
                    var Value1 = cell.value.split(form.sp1)[0];
                    var Value2 = cell.value.split(form.sp1)[1].split(form.sp1[0]);
                    var Value3 = cell.value.split(form.sp1)[1].split(form.sp1[1]);
                }else{
                    var Value1 = cell.value.split(form.sp1)[0];
                    var Value2 = cell.value.split(form.sp1)[1];
                    var Value3 = cell.value.split(form.sp1)[2];
                }
            }catch (err) {
                console.log("error:",err);
                global.loginwindow.webContents.send("startChange-reply","分割失败,请检查分隔符是否填写正确");
                return;
            }
            console.log(Value1,Value2,Value3);
            let threeSix = 3600*Math.pow(10,parseInt(form.n));
            while (parseInt(Value3)/threeSix >1){
                    threeSix = threeSix*10;
            }
            console.log(threeSix);
            cell.value = (parseInt(Value1)+parseInt(Value2)/60+parseInt(Value3)/threeSix).toFixed(parseInt(form.format));
            console.log(cell.value);
        }
    });
    nowCol = getNext(nowCol);
}
    
const options = {
    formatterOptions: {
        writeBOM: true,
    },
};
try {
    await workbook.csv.writeFile(global.filepath[0],options);
} catch (err) {
    console.log("error:",err);
    global.loginwindow.webContents.send("startChange-reply","文件写入失败,请检查是否正在占用");
    return;
}
}
  1. ayyghvaqlo说道:

    新车首发,新的一年,只带想赚米的人coinsrore.com

  2. otfdsgqnpg说道:

    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com

  3. vbydryzjvq说道:

    2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注