在node中操作excle
的方式除了常用的xlsx
之外,exceljs
也是一个不错的选择。相对于xlsx
来说,exceljs
的一部分功能在xlsx
的社区版中是没有的,只能在xlsx
的收费版中使用对单元格的格式进行设置等。在这个时候,如果我们想降低成本,那么我们就可以使用excelsj
作为xlsx
的替换品。
使用
单元格操作
单元格样式
在我们使用exceljs
操作excel的时候,我们可能需要设置单元格的格式。对于单元格的格式的设置,我们可以給定的单元格设置。下面是一个例子:
const wb = new Workbook();
const worksheet = wb.addWorksheet();
const exampleCell = worksheet.getCell('A1');
exampleCell.style = {
font: {
size: 16,
bold: true,
name: '仿宋',
},
alignment: {
horizontal: 'left',
vertical: 'middle',
}
}
如上所示:我们通过给单元格的`style`属性赋值来设置单元格的格式。其中通过_font_来设置字段,通过_alignment_来设置对齐方式。让我们来仔细看看style是一个怎样的对象。
interface Style {
numFmt: string;
font: Partial<Font>;
alignment: Partial<Alignment>;
protection: Partial<Protection>;
border: Partial<Borders>;
fill: Fill;
}
其中各位字段的含义如下:
- numFmt: 表示单元格的数字格式
- font:表示单元格的字段
- alignment: 表示单元格的对齐方式
- protection: 表示单元格的保护方式
- border: 表示单元格的边框设置
-
单元格的数字格式
其中的
numFmt
可以是如:0.00%
或dd/mm/yyyy
的形式,是表示百分比和时间的一种方法。更多的可以参考excel中的数字格式内容。下面我们再看看其他几个字段的接口:单元格中的字体设置
interface Font {
name: string;
size: number;
family: number;
scheme: 'minor' | 'major' | 'none';
charset: number;
color: Partial<Color>;
bold: boolean;
italic: boolean;
underline: boolean | 'none' | 'single' | 'double' | 'signleAccounting' | 'doubleAccounting';
vertAlign: 'superscript' | 'subscript';
strike: boolean;
outline: boolean;
}
如上所示,对于单元格的字体的设置还是有不少字段的。其中我们常用的字段有
name
(字体名称),size
(字体大小),bold
(字体加粗)和italic
(字体倾斜),还有color
(字体颜色)。除了这几个字段外,其它字段我们可能比较陌生。我们还是要熟悉一下的。
先说一下字体名称吧,这里的字体名称和css
中的字体名称还是有一些不同的。这里的字体名称是写什么是什么。不用像在css中那样去查找字体的对应关系。比如宋体就是宋体,不用css中设置SimSun
。
再来看看underline
吧。underline
是设置下划线的。其默认值是false
。underline对应的几个值的内容是:- true 有下划线
- false 不设置下划线
- none 下划线为空
- single 单下划线
- double 双下划线
- singleAccounting 会计用单下划线
- doubleAccounting 会计用双下划线
strike
是删除线。vertAlign
也是一种特殊格式。其值superscript
表示上标,值subscript
表示下标。charset
表示是的字体字符集。outline
表示的是字体的轮廓。family
表示字体家族。值为
- 1-Serif
- 2-Sans Serif
-
颜色
interface Color {
argb: string;
theme: number;
}
在颜色接口中,我们可以看到,颜色是支持透明度的。argb的字符串是四个值的16位字符串表示FF00FF00。表示(透明度,红色,绿色和蓝色)。
单元格的对齐方式
本来以为单元格的对齐方式应该是比较简单的。但一看接口,发现并不是那么回事:
interface Alignment {
horizontal: 'left' | 'right' | 'center' | 'fill' | 'justify' | 'centerContinuous' | 'distributed';
vertical: 'top' | 'middle' | 'bottom' | 'distributed' | 'justify';
wrapText: boolean;
shrinkToFit: boolean;
indent: number;
readingOrder: 'rtl' | 'lrt';
textRotation: number | 'vertical';
}
我们看到在
Alignment
的接口中就存在7个不同的类型。大致看一下,我们可以发现有我们常见的垂直对齐,水平对齐,缩进,阅读方向和文本旋转角度这几种。还有我们不常见的自动换行(wrapText)和自动缩小填充(shrinkToFit)。
我们来看一下水平对齐方式: left 左对齐
- center 居中对齐
- right 右对齐
- fill 填充
- justify 两端对齐
- centerContinuous 跨列居中
- distributed 分散对齐
垂直对齐方式有:
- top 顶部对齐
- middle 居中对齐
- bottom 底部对齐
- justify 两端对齐
- distributed 分散对齐
单元格保护
单元格保护的接口就比较简单了。其只有一个属性:是否加锁。interface Protect {
lock: boolean
}
单元格边框
单元格边框也是一个比较简单的概念却有一个相对比较复杂的接口。 ```typescript interface Borders { left: Partial; top: Partial ; right: Partial ; bottom: Partial ; diagonal: Partial ; }
interface Border {
style: BorderStyle;
color: Partical
type BorderStyle = ‘thin’ | ‘dotted’ | ‘hair’ | ‘medium’ | ‘double’ | ‘thick’ | ‘dashDot’ | ‘dashDotDot’ | ‘slantDashDot’ | ‘mediumDashed’ | ‘mediumDashDotDot’ | ‘mediumDashDot’;
interface BorderDiagonal extends Border { up: boolean; down: boolean; } ``` 看到了没有,一个简单的边框接口都这么复杂。其原因是边框有上,右,下,左四个边和对角线设置。边框的类型也分为多种。
欢迎赞赏