nodejs作为一门新的语言,报表功能也不是十分完善。
(1).js-xlsx : 目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析采用纯js实现,写入需要依赖nodejs或者FileSaver .js实现生成写入Excel,可以生成子表Excel,功能强大,但上手难度稍大。不提供基础设置Excel表格api例单元格宽度,文档有些乱,不适合快速上手;
https://github.com/SheetJS/js-xlsx
(2).node-xlsx : 基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件;
https://github.com/mgcrea/node-xlsx
(3).excel-parser : 基于Node.js解析excel文件数据,支持xls及xlsx格式文件,需要依赖python,太重不太实用;
https://github.com/leftshifters/excel-parser
(4).excel-export : 基于Node.js将数据生成导出excel文件,生成文件格式为xlsx,可以设置单元格宽度,API容易上手,无法生成worksheet字表,比较单一,基本功能可以基本满足;
https://github.com/functionscope/Node-Excel-Export
(5).node-xlrd : 基于node.js从excel文件中提取数据,仅支持xls格式文件,不支持xlsx,有点过时,常用的都是XLSX 格式。
nodejs刚出来那几年开发人员写了很多node依赖库,但是大部分现在处于不维护状态。
现在还在持续更新的只有node-xlsx excel-export推荐使用,js-xlsx作为一个大而全的基础库(虽然现在也不在更行了,此库最大的问题是api十分不友好,学习曲线高)有能力的项目组可以进一步封装,。
本篇为一个简单的下载的DEMO ,就简单使用excel-export,
var express = require(\'express\'); var router = express.Router(); var server = express(); server.use(\'/api\', router); var nodeExcel = require(\'excel-export\'); const disableLayout ={layout: false}; router.get(\'/test\', function(req, res, next) { res.json({ code:200 }) }) // disable interface layout.hbs user config layout: false router.get(\'/exportExcel/:id\', function(req, res, next) { var conf ={}; conf.stylesXmlFile = "styles.xml"; conf.name = "mysheet"; conf.cols = [{ caption:\'string\', type:\'string\', beforeCellWrite:function(row, cellData){ return cellData.toUpperCase(); }, width:300 },{ caption:\'date\', type:\'date\', beforeCellWrite:function(){ var originDate = new Date(Date.UTC(1899,11,30)); return function(row, cellData, eOpt){ console.log((cellData - originDate)); if (eOpt.rowNum%2){ eOpt.styleIndex = 1; } else{ eOpt.styleIndex = 2; } if (cellData === null){ eOpt.cellType = \'string\'; return \'N/A\'; } else return (cellData - originDate) / (24 * 60 * 60 * 1000); } }() },{ caption:\'bool\', type:\'bool\' },{ caption:\'number\', type:\'number\' }]; conf.rows = [ [\'pi\', \'2013-12-5\', true, 3.14], ["e", new Date(2012, 4, 1), false, 2.7182], ["M&M<>\'", new Date(Date.UTC(2013, 6, 9)), false, 1.61803], ["null date", null, true, 1.414] ]; var result = nodeExcel.execute(conf); res.setHeader(\'Content-Type\', \'application/vnd.openxmlformats\'); res.setHeader("Content-Disposition", "attachment; filename=" + encodeURIComponent("导出列表")+".xlsx"); res.end(result, \'binary\'); }); router.get(\'/exportmultisheetExcel/:id\', function(req, res, next) { var confs = []; var conf = {}; conf.cols = [{ caption: \'string\', type: \'string\' }, { caption: \'date\', type: \'date\' }, { caption: \'bool\', type: \'bool\' }, { caption: \'number 2\', type: \'number\' }]; conf.rows = [[\'hahai\', (new Date(Date.UTC(2013, 4, 1))).oaDate(), true, 3.14], ["e", (new Date(2012, 4, 1)).oaDate(), false, 2.7182], ["M&M<>\'", (new Date(Date.UTC(2013, 6, 9))).oaDate(), false, 1.2], ["null", null, null, null]]; for (var i = 0; i < 3; i++) { conf = JSON.parse(JSON.stringify(conf)); //clone conf.name = \'sheet\'+i; confs.push(conf); } var result = nodeExcel.execute(confs); res.setHeader(\'Content-Type\', \'application/vnd.openxmlformats\'); res.setHeader("Content-Disposition", "attachment; filename=" + "Report.xlsx"); res.end(result, \'binary\'); }); var server=server.listen(8080,function(){ console.log(\'8080\') })
3.excel-export 提供了4种类型的数据格式,数字,时间,真假,默认字符串
cols可以为设置列类型的 caption为列名(会填充第一行的内容),type为列数据类型,beforeCellWrite可以在填充之前对数据进行逻辑处理,width可以定义宽带
rows为一个二位数组,直接按照行列方式填充excel的内容
name定义sheet的名字
值得注意的时候excel-export如果需要定义excel的默认格式,需要引用一个excel的格式头,这个头定义在styles.xml中,这个文件可以在node_modules/example/styles.xml中拷贝的项目对应目录
例子用的是根目录,所以我们需放在根目录,不然就会报找不到这个文件。
实际开发中,有时候excel的文件导出时要用中文,这时候要设置下header和格式化中文即可
res.setHeader(\'Content-Type\', \'application/vnd.openxmlformats;charset=utf-8\');
res.setHeader("Content-Disposition", "attachment; filename=" +encodeURIComponent("导出列表")+".xlsx");