nodejs+exceljs模块实现页面下载excel文件(代码教程)

  • 2022-11-28 17:53:16

我的node版本是v6.10.0

最近用nodejs作为后台搭建了一个简单的管理系统,有个需求是需要采集数据生成excel通过浏览器下载。

从网上查了很多例子,由于nodejs发展的比较快,版本变更频繁,相关的资料不太好找,最后我用exceljs+nodejs本身实现了这个功能,放在这里记录一下。

整体实现分两步

一、前台点击按钮生成excel

前台代码

// 导出excel按钮按下处理
form.on('submit(export)', function(data){
    $.post("exportSgxxExcel",{data:JSON.stringify(data.field)},function(result) {
        // 取得文件地址
        console.log(result.path);
        // $.get("download", {path:result.path}, function(){
        //    console.log('text');
        // });
        location.href ="download?path="+result.path;
    });
    return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
});

后台代码

// 导出XX信息excel
exports.exportSgxxExcel = function(req, res){
    // 检索XX信息数据
    var sql = "SELECT XX from XX where XX=XX";
    // 取得数据
    connection.query(sql, function(err, rows, fields){
        if(err){
            // 系统异常
            console.log(err);
            res.json({'status':'error'});
        }else{
            //console.log("取得数据为"+JSON.stringify(rows));
            // 生成一个文件
            var workbook = new Excel.Workbook();
            // 添加一个sheet
            var sheet = workbook.addWorksheet('XX信息');
            // 设置sheet页的表头
            sheet.columns = [
                { header: 'AA', key: 'bb', width: 10 },
                { header: 'CC', key: 'dd', width: 10 },
            ];
            // 设置行数据
            //console.log(JSON.stringify(rows));
            sheet.addRows(rows);
            // 取得当前时间
            var date = Moment().format('YYYYMMDD_HHmmss');
            var path = downloadPath+date+"_XX信息.xlsx";
            workbook.xlsx.writeFile(path)
                .then(function() {
                    res.json({'path':path});
                });
        }
    });
};

这一步会在服务器本地你设置的downloadPath下生成一个excel文件,并且把文件的真实路径返回到post的回调中

二、下载文件

前台代码其实就在上一步的代码中,就一句

location.href ="download?path="+result.path;

后台代码也很简单

// 下载文件
exports.download = function(req, res){
    // 取得前台传过来的文件path
    var path = req.query.path;
    console.log('准备下载------'+path);
    // 取得文件名
    var filename = path.substring(path.lastIndexOf('/')+1);
    // 下载处理
    res.download(path, filename);
};

nodejs的express模块自带下载,直接按照上面的写法就能下载了

注意以下几点,downloadPath最好用相对路径,这种下载的实现好像只能用get请求,post没实验成功。

exceljs使用方式直接参考github上的说明就行,看api还是很强大的,能实现很多操作,不过我这就用了很简单的一部分。

猜你喜欢