使用js导出Excel文档

OverView

最近研究了一下js中一个导出数据到Excel的模块。发现国内竟然没有人翻译。而小学弟学妹们听见导出Excel什么的,更是闻虎色变。其实没那么难。今天香蕉君就翻译一下。原文地址传送门。注意下面都是我这个英语渣的翻译,如果发现了错误欢迎指出。

翻译之前再啰嗦几句

安装node使用npm下载依赖。(真不知道我在担心些什么)

使用 excel-export

在传入到execute 方法前设置好‘设置’对象的值。如果你想生成多个“工作表”(译者加:就是Excel下方那个可以切换的地方也有叫做sheet的),那么建立一个对象数组即可。或者你可以直接传对象就会在一个“工作表中”
使用name属性可以给这个“工作表”命名。
使用clos是一个给纵列定义属性的数组。纵列的定义需要caption名称和type类型两个必须字段,和宽度可选字段。宽度是字符的。[1]属性中还可是定义一个叫做beforeCellWrite的回调函数。这函数有row(行),cell data(单元数据),option object(配置对象)(一会再说)三个形参。返回值就是填充这个单元的真正数据。(译者加:明显这是为了方便预处理)。支持的类型有:string(字符串),date(日期),bool(逻辑)和 number(数值)类型。
使用rows表示要被导出的数据。它是数组的数组。它的每个数组长度要和clos一致。
表格的样式是可选的。然而如果你使用表格样式,那么一个有效的样式xml文件是必须的。一个简单的方法获取这样的文件的方法是‘unzip’[2]一个包含你想要样式的Excel并把样式文件复制出来使用。使用stylesXmlFile属性赋值来使用。了解更多样式请百度。呵呵。
eOpt(配置对象)在刚才说的回调函数中包含行和列的信息。eOpt.styleIndex应该是一个从0开的的所以,表示选择传入样式文件中表示单元格样式的标签。eOpt.cellType默认情况下是和之前定义好的type是保持一致的。然而在特定的应用场景下你也可以修改他。

[1] 原文这里是 The unit for width property is character。但是看代码这里似乎是一个数字类型。

[2] ‘unzip’是什么操作?解压?这里不知道怎么翻译。也不知道怎么从其中导出样式文件。如果知道的希望告知,谢谢。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var express = require('express');
var nodeExcel = require('excel-export');
var app = express();
app.get('/Excel', function(req, res){
var conf ={};
conf.stylesXmlFile = "styles.xml";
conf.name = "mysheet";
conf.cols = [{
caption:'string',
type:'string',
beforeCellWrite:function(row, cellData){
return cellData.toUpperCase();
},
width:28.7109375
},{
caption:'date',
type:'date',
beforeCellWrite:function(){
var originDate = new Date(Date.UTC(1899,11,30));
return function(row, cellData, eOpt){
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', new Date(Date.UTC(2013, 4, 1)), 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=" + "Report.xlsx");
res.end(result, 'binary');
});
app.listen(3000);
console.log('Listening on port 3000');

鸣谢

最后再次感谢这个模块的作者。functionscope。谢谢你的工作,真的很棒。
finally,thanks to the author functionscope.greate work,Really Inspiring!

我将一直的无知与迷惑,我是黄油香蕉君,再见。

给作者买杯咖啡吧。喵~