在Node.js中使用ejsexcel输出EXCEL文件
1、背景
在Nodejs应用程序中输出Excel,第一印象想到的一般是node-xlsx,这类插件不仅需要我们通过JS写入数据,还需要通过JS进行EXCEL显示样式的管理。
这是个大问题,不仅代码冗余,而且非常不易于维护,假设业务需要合并一个单元格,或者换个颜色,我们都需要重新修改代码。
反思这个问题的核心,跟使用JS来操作页面样式其实是同一个道理,我们没有把数据/业务逻辑操作和样式分离。
在WEB开发中,我们有了CSS来分离处理样式的问题。
现在,在输出EXCEL的时候,我们也希望将样式问题分离出去。
2、ejsexcel
ejsexcel 就是在这样的背景下诞生的。
1、业务人员提供EXCEL模板,包含显示样式以及固定文本。
2、数据部分由开发者按照ejs格式录入。
3、Nodejs应用程序只需要准备好数据,然后通过ejsexcel注入到EXCEL模板中即可。
3、DEMO
1、Excel模板

可以输出单个对象,也可以通过forRow关键字进行循环输出。
另外,其中的脚本同样支持JS相关函数。
2、注入数据
//读取excel模板
let daily_excel_template = fs.readFileSync(DAILY_TEMPLATE) //用数据源(对象)data渲染Excel模板
let self = this
ejsExcel.renderExcelCb(daily_excel_template, reportData, function(err,exlBuf2){
if(err) {
logger.fatal('[EXCEL生成失败!]:'+DAILY_TEMPLATE)
logger.info(err)
return;
}
fs.writeFileSync(filename, exlBuf2);
logger.info('[EXCEL生成成功!]:'+DAILY_TEMPLATE)
});
以上是部分代码:
首先读取模板EXCEL文件,然后调用ejsExcel.renderExcelCb方法将数据注入模板中,由模板生成最终的EXCEL文件。
4、注意的问题
- 作者手工编译了Node-Expat,所以使用前确保你使用的node版本以及操作系统已经被正确编译,如没有需要自行编译对应版本的node-expat二进制文件。点击这里查看目前已经编译的版本。
- 目前还不支持EXCEL条件格式。
在Node.js中使用ejsexcel输出EXCEL文件的更多相关文章
- Node.js中使用pipe拷贝大文件不能完全拷贝的解决办法
原来的代码如下: var readable = fs.createReadStream( filepath ); var writable = fs.createWriteStream( outFil ...
- 如何在Node.js中合并两个复杂对象
通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢? 例如我有以下两个object: ...
- 初步揭秘node.js中的事件
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
- node.js中process进程的概念和child_process子进程模块的使用
进程,你可以把它理解成一个正在运行的程序.node.js中每个应用程序都是进程类的实例对象. node.js中有一个 process 全局对象,通过它我们可以获取,运行该程序的用户,环境变量等信息. ...
- node.js中通过stream模块实现自定义流
有些时候我们需要自定义一些流,来操作特殊对象,node.js中为我们提供了一些基本流类. 我们新创建的流类需要继承四个基本流类之一(stream.Writeable,stream.Readable,s ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- NodeJs>------->>第二章:Node.js中交互式运行环境--------REL
第二章:Node.js中交互式运行环境--------REL 一:REPL运行环境概述 C:\Users\junliu>node > foo = 'bar' ; 'bar' > 二: ...
- 在Node.js中操作文件系统(一)
在Node.js中操作文件系统 在Node.js中,使用fs模块来实现所有有关文件及目录的创建,写入及删除操作.在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法.比如在执行读文件操作 ...
- Node.js中Process.nextTick()和setImmediate()的区别
一.Webstrom使用node.js IDE的问题 在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate().re ...
随机推荐
- Django Model的外键自关联‘self'和设置'unique_together'
在django的model定义中,有时需要某个Field引用当前定义的Model,比如一个部门(Department)的Model,它有一个字段是上级部门(super_department),上级部门 ...
- Python学习进阶之薄弱点总结
''' 1.实现用户传入一个普通字符串, 返回字符串的md5加密结果的函数 ''' # import hashlib # # def M(str): # m = hashlib.md5() # m.u ...
- 【oracle】drop,truncate,delete用法
drop: drop table 表名:删表 truncate: truncate table 表名:清空数据 delete: delete table 表名 [where 条件]:删某数据 日志:d ...
- Kali系统改国内源配置和SSH配置
一.Kali系统更新源 使用官网的虚拟化镜像安装,默认为英文界面,更新源也是官方源.因为官方服务器在国外,速度不是很理想,现在就来改国内源并且更新系统. 1.使用编辑器打开系统源文本(在终端内操作,先 ...
- mysql 8创建远程访问用户以及连接mysql速度慢的解决方法
mysql 8创建远程访问用户 [root@demo /]# mysql -u root -p #登录服务器数据库 Enter password:123xxx >user mysql; & ...
- hdu 6620 Just an Old Puzzle(N数码问题)
http://acm.hdu.edu.cn/showproblem.php?pid=6620 N数码问题: n*n矩阵,里面填着1—n*n-1,还有1个空格, 通过上下左右移动空格的位置, 使矩阵里的 ...
- 【LG3647】[APIO2014]连珠线
[LG3647][APIO2014]连珠线 题面 洛谷 题解 首先考虑一下蓝线连起来的情况,一定是儿子-父亲-另一个儿子或者是儿子-父亲-父亲的父亲. 而因为一开始只有一个点在当前局面上,将一条红边变 ...
- 关于window PC机的预定义宏win32
MSDN 里说,VC 有 3 个预处理常量,分别是 _WIN32,_WIN64,WIN32.这三个常量如何使用呢?看起来简单,其实是很困惑的. 在 Win32 配置下,WIN32 在“项目属性-C/C ...
- 【cf比赛记录】Educational Codeforces Round 78 (Rated for Div. 2)
比赛传送门 A. Shuffle Hashing 题意:加密字符串.可以把字符串的字母打乱后再从前面以及后面接上字符串.问加密后的字符串是否符合加密规则. 题解:字符串的长度很短,直接暴力搜索所有情况 ...
- javascript 数组之间增加某个符合arr.join('、');
var arr=["a","b","c"]; arr.join(',');//返回值是字符串:a,b,c