欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-23 18:14:06
我的node版本是v6.10.0 最近用nodejs作为后台搭建了一个简单的管理系统,有个需求是需要采集数据生成excel通过浏览器下载。 从网上查了很多例子,由于nodej...

我的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还是很强大的,能实现很多操作,不过我这就用了很简单的一部分。