@yuanliwei/exceljs 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +3024 -0
- package/README_zh.md +2878 -0
- package/excel.js +13 -0
- package/index.d.ts +2040 -0
- package/index.ts +2 -0
- package/lib/csv/csv.js +191 -0
- package/lib/csv/line-buffer.js +74 -0
- package/lib/csv/stream-converter.js +135 -0
- package/lib/doc/anchor.js +91 -0
- package/lib/doc/cell.js +1124 -0
- package/lib/doc/column.js +320 -0
- package/lib/doc/data/theme1.json +234 -0
- package/lib/doc/data-validations.js +19 -0
- package/lib/doc/defined-names.js +196 -0
- package/lib/doc/enums.js +48 -0
- package/lib/doc/image.js +59 -0
- package/lib/doc/modelcontainer.js +18 -0
- package/lib/doc/note.js +65 -0
- package/lib/doc/pivot-table.js +132 -0
- package/lib/doc/range.js +257 -0
- package/lib/doc/row.js +415 -0
- package/lib/doc/table.js +465 -0
- package/lib/doc/workbook.js +224 -0
- package/lib/doc/worksheet.js +949 -0
- package/lib/exceljs.bare.js +13 -0
- package/lib/exceljs.browser.js +36 -0
- package/lib/exceljs.nodejs.js +14 -0
- package/lib/stream/xlsx/hyperlink-reader.js +83 -0
- package/lib/stream/xlsx/sheet-comments-writer.js +121 -0
- package/lib/stream/xlsx/sheet-rels-writer.js +119 -0
- package/lib/stream/xlsx/workbook-reader.js +337 -0
- package/lib/stream/xlsx/workbook-writer.js +347 -0
- package/lib/stream/xlsx/worksheet-reader.js +374 -0
- package/lib/stream/xlsx/worksheet-writer.js +717 -0
- package/lib/utils/auto-drain.js +15 -0
- package/lib/utils/browser-buffer-decode.js +14 -0
- package/lib/utils/browser-buffer-encode.js +15 -0
- package/lib/utils/cell-matrix.js +165 -0
- package/lib/utils/col-cache.js +287 -0
- package/lib/utils/copy-style.js +43 -0
- package/lib/utils/encryptor.js +55 -0
- package/lib/utils/iterate-stream.js +48 -0
- package/lib/utils/parse-sax.js +30 -0
- package/lib/utils/shared-formula.js +44 -0
- package/lib/utils/shared-strings.js +35 -0
- package/lib/utils/stream-base64.js +72 -0
- package/lib/utils/stream-buf.js +364 -0
- package/lib/utils/string-buf.js +82 -0
- package/lib/utils/string-builder.js +35 -0
- package/lib/utils/stuttered-pipe.js +67 -0
- package/lib/utils/typed-stack.js +24 -0
- package/lib/utils/under-dash.js +184 -0
- package/lib/utils/utils.js +205 -0
- package/lib/utils/xml-stream.js +169 -0
- package/lib/utils/zip-stream.js +87 -0
- package/lib/xlsx/.rels +11 -0
- package/lib/xlsx/calcChain.xml +6 -0
- package/lib/xlsx/core.xml +7 -0
- package/lib/xlsx/defaultnumformats.js +153 -0
- package/lib/xlsx/rel-type.js +20 -0
- package/lib/xlsx/styles.xml +41 -0
- package/lib/xlsx/workbook.xml +16 -0
- package/lib/xlsx/xform/base-xform.js +145 -0
- package/lib/xlsx/xform/book/defined-name-xform.js +91 -0
- package/lib/xlsx/xform/book/sheet-xform.js +34 -0
- package/lib/xlsx/xform/book/workbook-calc-properties-xform.js +26 -0
- package/lib/xlsx/xform/book/workbook-pivot-cache-xform.js +29 -0
- package/lib/xlsx/xform/book/workbook-properties-xform.js +29 -0
- package/lib/xlsx/xform/book/workbook-view-xform.js +53 -0
- package/lib/xlsx/xform/book/workbook-xform.js +259 -0
- package/lib/xlsx/xform/comment/comment-xform.js +105 -0
- package/lib/xlsx/xform/comment/comments-xform.js +82 -0
- package/lib/xlsx/xform/comment/style/vml-position-xform.js +39 -0
- package/lib/xlsx/xform/comment/style/vml-protection-xform.js +36 -0
- package/lib/xlsx/xform/comment/vml-anchor-xform.js +60 -0
- package/lib/xlsx/xform/comment/vml-client-data-xform.js +95 -0
- package/lib/xlsx/xform/comment/vml-notes-xform.js +107 -0
- package/lib/xlsx/xform/comment/vml-shape-xform.js +95 -0
- package/lib/xlsx/xform/comment/vml-textbox-xform.js +64 -0
- package/lib/xlsx/xform/composite-xform.js +56 -0
- package/lib/xlsx/xform/core/app-heading-pairs-xform.js +32 -0
- package/lib/xlsx/xform/core/app-titles-of-parts-xform.js +28 -0
- package/lib/xlsx/xform/core/app-xform.js +100 -0
- package/lib/xlsx/xform/core/content-types-xform.js +135 -0
- package/lib/xlsx/xform/core/core-xform.js +136 -0
- package/lib/xlsx/xform/core/relationship-xform.js +25 -0
- package/lib/xlsx/xform/core/relationships-xform.js +73 -0
- package/lib/xlsx/xform/drawing/base-cell-anchor-xform.js +48 -0
- package/lib/xlsx/xform/drawing/blip-fill-xform.js +71 -0
- package/lib/xlsx/xform/drawing/blip-xform.js +42 -0
- package/lib/xlsx/xform/drawing/c-nv-pic-pr-xform.js +38 -0
- package/lib/xlsx/xform/drawing/c-nv-pr-xform.js +68 -0
- package/lib/xlsx/xform/drawing/cell-position-xform.js +77 -0
- package/lib/xlsx/xform/drawing/drawing-xform.js +109 -0
- package/lib/xlsx/xform/drawing/ext-lst-xform.js +43 -0
- package/lib/xlsx/xform/drawing/ext-xform.js +44 -0
- package/lib/xlsx/xform/drawing/hlink-click-xform.js +41 -0
- package/lib/xlsx/xform/drawing/nv-pic-pr-xform.js +65 -0
- package/lib/xlsx/xform/drawing/one-cell-anchor-xform.js +63 -0
- package/lib/xlsx/xform/drawing/pic-xform.js +77 -0
- package/lib/xlsx/xform/drawing/sp-pr.js +17 -0
- package/lib/xlsx/xform/drawing/two-cell-anchor-xform.js +62 -0
- package/lib/xlsx/xform/list-xform.js +95 -0
- package/lib/xlsx/xform/pivot-table/cache-field.js +43 -0
- package/lib/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +77 -0
- package/lib/xlsx/xform/pivot-table/pivot-cache-records-xform.js +103 -0
- package/lib/xlsx/xform/pivot-table/pivot-table-xform.js +189 -0
- package/lib/xlsx/xform/sheet/auto-filter-xform.js +38 -0
- package/lib/xlsx/xform/sheet/cell-xform.js +498 -0
- package/lib/xlsx/xform/sheet/cf/cf-rule-xform.js +301 -0
- package/lib/xlsx/xform/sheet/cf/cfvo-xform.js +27 -0
- package/lib/xlsx/xform/sheet/cf/color-scale-xform.js +45 -0
- package/lib/xlsx/xform/sheet/cf/conditional-formatting-xform.js +48 -0
- package/lib/xlsx/xform/sheet/cf/conditional-formattings-xform.js +92 -0
- package/lib/xlsx/xform/sheet/cf/databar-xform.js +49 -0
- package/lib/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +87 -0
- package/lib/xlsx/xform/sheet/cf/formula-xform.js +25 -0
- package/lib/xlsx/xform/sheet/cf/icon-set-xform.js +47 -0
- package/lib/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +27 -0
- package/lib/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +98 -0
- package/lib/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +43 -0
- package/lib/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +62 -0
- package/lib/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +50 -0
- package/lib/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +98 -0
- package/lib/xlsx/xform/sheet/cf-ext/f-ext-xform.js +25 -0
- package/lib/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +73 -0
- package/lib/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +25 -0
- package/lib/xlsx/xform/sheet/col-xform.js +86 -0
- package/lib/xlsx/xform/sheet/data-validations-xform.js +257 -0
- package/lib/xlsx/xform/sheet/dimension-xform.js +29 -0
- package/lib/xlsx/xform/sheet/drawing-xform.js +33 -0
- package/lib/xlsx/xform/sheet/ext-lst-xform.js +86 -0
- package/lib/xlsx/xform/sheet/header-footer-xform.js +146 -0
- package/lib/xlsx/xform/sheet/hyperlink-xform.js +54 -0
- package/lib/xlsx/xform/sheet/merge-cell-xform.js +27 -0
- package/lib/xlsx/xform/sheet/merges.js +56 -0
- package/lib/xlsx/xform/sheet/outline-properties-xform.js +43 -0
- package/lib/xlsx/xform/sheet/page-breaks-xform.js +27 -0
- package/lib/xlsx/xform/sheet/page-margins-xform.js +49 -0
- package/lib/xlsx/xform/sheet/page-setup-properties-xform.js +35 -0
- package/lib/xlsx/xform/sheet/page-setup-xform.js +103 -0
- package/lib/xlsx/xform/sheet/picture-xform.js +33 -0
- package/lib/xlsx/xform/sheet/print-options-xform.js +49 -0
- package/lib/xlsx/xform/sheet/row-breaks-xform.js +39 -0
- package/lib/xlsx/xform/sheet/row-xform.js +142 -0
- package/lib/xlsx/xform/sheet/sheet-format-properties-xform.js +55 -0
- package/lib/xlsx/xform/sheet/sheet-properties-xform.js +90 -0
- package/lib/xlsx/xform/sheet/sheet-protection-xform.js +89 -0
- package/lib/xlsx/xform/sheet/sheet-view-xform.js +202 -0
- package/lib/xlsx/xform/sheet/table-part-xform.js +33 -0
- package/lib/xlsx/xform/sheet/worksheet-xform.js +548 -0
- package/lib/xlsx/xform/simple/boolean-xform.js +31 -0
- package/lib/xlsx/xform/simple/date-xform.js +66 -0
- package/lib/xlsx/xform/simple/float-xform.js +51 -0
- package/lib/xlsx/xform/simple/integer-xform.js +57 -0
- package/lib/xlsx/xform/simple/string-xform.js +51 -0
- package/lib/xlsx/xform/static-xform.js +64 -0
- package/lib/xlsx/xform/strings/phonetic-text-xform.js +98 -0
- package/lib/xlsx/xform/strings/rich-text-xform.js +101 -0
- package/lib/xlsx/xform/strings/shared-string-xform.js +102 -0
- package/lib/xlsx/xform/strings/shared-strings-xform.js +127 -0
- package/lib/xlsx/xform/strings/text-xform.js +44 -0
- package/lib/xlsx/xform/style/alignment-xform.js +172 -0
- package/lib/xlsx/xform/style/border-xform.js +207 -0
- package/lib/xlsx/xform/style/color-xform.js +63 -0
- package/lib/xlsx/xform/style/dxf-xform.js +111 -0
- package/lib/xlsx/xform/style/fill-xform.js +364 -0
- package/lib/xlsx/xform/style/font-xform.js +102 -0
- package/lib/xlsx/xform/style/numfmt-xform.js +63 -0
- package/lib/xlsx/xform/style/protection-xform.js +60 -0
- package/lib/xlsx/xform/style/style-xform.js +125 -0
- package/lib/xlsx/xform/style/styles-xform.js +527 -0
- package/lib/xlsx/xform/style/underline-xform.js +47 -0
- package/lib/xlsx/xform/table/auto-filter-xform.js +81 -0
- package/lib/xlsx/xform/table/custom-filter-xform.js +33 -0
- package/lib/xlsx/xform/table/filter-column-xform.js +96 -0
- package/lib/xlsx/xform/table/filter-xform.js +31 -0
- package/lib/xlsx/xform/table/table-column-xform.js +44 -0
- package/lib/xlsx/xform/table/table-style-info-xform.js +41 -0
- package/lib/xlsx/xform/table/table-xform.js +131 -0
- package/lib/xlsx/xlsx.js +774 -0
- package/lib/xlsx/xml/theme1.js +3 -0
- package/lib/xlsx/xml/theme1.xml +318 -0
- package/package.json +149 -0
package/lib/doc/cell.js
ADDED
|
@@ -0,0 +1,1124 @@
|
|
|
1
|
+
/* eslint-disable max-classes-per-file */
|
|
2
|
+
const colCache = require('../utils/col-cache');
|
|
3
|
+
const _ = require('../utils/under-dash');
|
|
4
|
+
const Enums = require('./enums');
|
|
5
|
+
const {slideFormula} = require('../utils/shared-formula');
|
|
6
|
+
const Note = require('./note');
|
|
7
|
+
// Cell requirements
|
|
8
|
+
// Operate inside a worksheet
|
|
9
|
+
// Store and retrieve a value with a range of types: text, number, date, hyperlink, reference, formula, etc.
|
|
10
|
+
// Manage/use and manipulate cell format either as local to cell or inherited from column or row.
|
|
11
|
+
|
|
12
|
+
class Cell {
|
|
13
|
+
constructor(row, column, address) {
|
|
14
|
+
if (!row || !column) {
|
|
15
|
+
throw new Error('A Cell needs a Row');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
this._row = row;
|
|
19
|
+
this._column = column;
|
|
20
|
+
|
|
21
|
+
colCache.validateAddress(address);
|
|
22
|
+
this._address = address;
|
|
23
|
+
|
|
24
|
+
// TODO: lazy evaluation of this._value
|
|
25
|
+
this._value = Value.create(Cell.Types.Null, this);
|
|
26
|
+
|
|
27
|
+
this.style = this._mergeStyle(row.style, column.style, {});
|
|
28
|
+
|
|
29
|
+
this._mergeCount = 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get worksheet() {
|
|
33
|
+
return this._row.worksheet;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
get workbook() {
|
|
37
|
+
return this._row.worksheet.workbook;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// help GC by removing cyclic (and other) references
|
|
41
|
+
destroy() {
|
|
42
|
+
delete this.style;
|
|
43
|
+
delete this._value;
|
|
44
|
+
delete this._row;
|
|
45
|
+
delete this._column;
|
|
46
|
+
delete this._address;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// =========================================================================
|
|
50
|
+
// Styles stuff
|
|
51
|
+
get numFmt() {
|
|
52
|
+
return this.style.numFmt;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
set numFmt(value) {
|
|
56
|
+
this.style.numFmt = value;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
get font() {
|
|
60
|
+
return this.style.font;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
set font(value) {
|
|
64
|
+
this.style.font = value;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get alignment() {
|
|
68
|
+
return this.style.alignment;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
set alignment(value) {
|
|
72
|
+
this.style.alignment = value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
get border() {
|
|
76
|
+
return this.style.border;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
set border(value) {
|
|
80
|
+
this.style.border = value;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
get fill() {
|
|
84
|
+
return this.style.fill;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
set fill(value) {
|
|
88
|
+
this.style.fill = value;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
get protection() {
|
|
92
|
+
return this.style.protection;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
set protection(value) {
|
|
96
|
+
this.style.protection = value;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
_mergeStyle(rowStyle, colStyle, style) {
|
|
100
|
+
const numFmt = (rowStyle && rowStyle.numFmt) || (colStyle && colStyle.numFmt);
|
|
101
|
+
if (numFmt) style.numFmt = numFmt;
|
|
102
|
+
|
|
103
|
+
const font = (rowStyle && rowStyle.font) || (colStyle && colStyle.font);
|
|
104
|
+
if (font) style.font = font;
|
|
105
|
+
|
|
106
|
+
const alignment = (rowStyle && rowStyle.alignment) || (colStyle && colStyle.alignment);
|
|
107
|
+
if (alignment) style.alignment = alignment;
|
|
108
|
+
|
|
109
|
+
const border = (rowStyle && rowStyle.border) || (colStyle && colStyle.border);
|
|
110
|
+
if (border) style.border = border;
|
|
111
|
+
|
|
112
|
+
const fill = (rowStyle && rowStyle.fill) || (colStyle && colStyle.fill);
|
|
113
|
+
if (fill) style.fill = fill;
|
|
114
|
+
|
|
115
|
+
const protection = (rowStyle && rowStyle.protection) || (colStyle && colStyle.protection);
|
|
116
|
+
if (protection) style.protection = protection;
|
|
117
|
+
|
|
118
|
+
return style;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// =========================================================================
|
|
122
|
+
// return the address for this cell
|
|
123
|
+
get address() {
|
|
124
|
+
return this._address;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
get row() {
|
|
128
|
+
return this._row.number;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
get col() {
|
|
132
|
+
return this._column.number;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
get $col$row() {
|
|
136
|
+
return `$${this._column.letter}$${this.row}`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// =========================================================================
|
|
140
|
+
// Value stuff
|
|
141
|
+
|
|
142
|
+
get type() {
|
|
143
|
+
return this._value.type;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
get effectiveType() {
|
|
147
|
+
return this._value.effectiveType;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
toCsvString() {
|
|
151
|
+
return this._value.toCsvString();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// =========================================================================
|
|
155
|
+
// Merge stuff
|
|
156
|
+
|
|
157
|
+
addMergeRef() {
|
|
158
|
+
this._mergeCount++;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
releaseMergeRef() {
|
|
162
|
+
this._mergeCount--;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
get isMerged() {
|
|
166
|
+
return this._mergeCount > 0 || this.type === Cell.Types.Merge;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
merge(master, ignoreStyle) {
|
|
170
|
+
this._value.release();
|
|
171
|
+
this._value = Value.create(Cell.Types.Merge, this, master);
|
|
172
|
+
if (!ignoreStyle) {
|
|
173
|
+
this.style = master.style;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
unmerge() {
|
|
178
|
+
if (this.type === Cell.Types.Merge) {
|
|
179
|
+
this._value.release();
|
|
180
|
+
this._value = Value.create(Cell.Types.Null, this);
|
|
181
|
+
this.style = this._mergeStyle(this._row.style, this._column.style, {});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
isMergedTo(master) {
|
|
186
|
+
if (this._value.type !== Cell.Types.Merge) return false;
|
|
187
|
+
return this._value.isMergedTo(master);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
get master() {
|
|
191
|
+
if (this.type === Cell.Types.Merge) {
|
|
192
|
+
return this._value.master;
|
|
193
|
+
}
|
|
194
|
+
return this; // an unmerged cell is its own master
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
get isHyperlink() {
|
|
198
|
+
return this._value.type === Cell.Types.Hyperlink;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
get hyperlink() {
|
|
202
|
+
return this._value.hyperlink;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// return the value
|
|
206
|
+
get value() {
|
|
207
|
+
return this._value.value;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// set the value - can be number, string or raw
|
|
211
|
+
set value(v) {
|
|
212
|
+
// special case - merge cells set their master's value
|
|
213
|
+
if (this.type === Cell.Types.Merge) {
|
|
214
|
+
this._value.master.value = v;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
this._value.release();
|
|
219
|
+
|
|
220
|
+
// assign value
|
|
221
|
+
this._value = Value.create(Value.getType(v), this, v);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
get note() {
|
|
225
|
+
return this._comment && this._comment.note;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
set note(note) {
|
|
229
|
+
this._comment = new Note(note);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
get text() {
|
|
233
|
+
return this._value.toString();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
get html() {
|
|
237
|
+
return _.escapeHtml(this.text);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
toString() {
|
|
241
|
+
return this.text;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
_upgradeToHyperlink(hyperlink) {
|
|
245
|
+
// if this cell is a string, turn it into a Hyperlink
|
|
246
|
+
if (this.type === Cell.Types.String) {
|
|
247
|
+
this._value = Value.create(Cell.Types.Hyperlink, this, {
|
|
248
|
+
text: this._value.value,
|
|
249
|
+
hyperlink,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// =========================================================================
|
|
255
|
+
// Formula stuff
|
|
256
|
+
get formula() {
|
|
257
|
+
return this._value.formula;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
get result() {
|
|
261
|
+
return this._value.result;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
get formulaType() {
|
|
265
|
+
return this._value.formulaType;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// =========================================================================
|
|
269
|
+
// Name stuff
|
|
270
|
+
get fullAddress() {
|
|
271
|
+
const {worksheet} = this._row;
|
|
272
|
+
return {
|
|
273
|
+
sheetName: worksheet.name,
|
|
274
|
+
address: this.address,
|
|
275
|
+
row: this.row,
|
|
276
|
+
col: this.col,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
get name() {
|
|
281
|
+
return this.names[0];
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
set name(value) {
|
|
285
|
+
this.names = [value];
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
get names() {
|
|
289
|
+
return this.workbook.definedNames.getNamesEx(this.fullAddress);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
set names(value) {
|
|
293
|
+
const {definedNames} = this.workbook;
|
|
294
|
+
definedNames.removeAllNames(this.fullAddress);
|
|
295
|
+
value.forEach(name => {
|
|
296
|
+
definedNames.addEx(this.fullAddress, name);
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
addName(name) {
|
|
301
|
+
this.workbook.definedNames.addEx(this.fullAddress, name);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
removeName(name) {
|
|
305
|
+
this.workbook.definedNames.removeEx(this.fullAddress, name);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
removeAllNames() {
|
|
309
|
+
this.workbook.definedNames.removeAllNames(this.fullAddress);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// =========================================================================
|
|
313
|
+
// Data Validation stuff
|
|
314
|
+
get _dataValidations() {
|
|
315
|
+
return this.worksheet.dataValidations;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
get dataValidation() {
|
|
319
|
+
return this._dataValidations.find(this.address);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
set dataValidation(value) {
|
|
323
|
+
this._dataValidations.add(this.address, value);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// =========================================================================
|
|
327
|
+
// Model stuff
|
|
328
|
+
|
|
329
|
+
get model() {
|
|
330
|
+
const {model} = this._value;
|
|
331
|
+
model.style = this.style;
|
|
332
|
+
if (this._comment) {
|
|
333
|
+
model.comment = this._comment.model;
|
|
334
|
+
}
|
|
335
|
+
return model;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
set model(value) {
|
|
339
|
+
this._value.release();
|
|
340
|
+
this._value = Value.create(value.type, this);
|
|
341
|
+
this._value.model = value;
|
|
342
|
+
|
|
343
|
+
if (value.comment) {
|
|
344
|
+
switch (value.comment.type) {
|
|
345
|
+
case 'note':
|
|
346
|
+
this._comment = Note.fromModel(value.comment);
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (value.style) {
|
|
352
|
+
this.style = value.style;
|
|
353
|
+
} else {
|
|
354
|
+
this.style = {};
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
Cell.Types = Enums.ValueType;
|
|
359
|
+
|
|
360
|
+
// =============================================================================
|
|
361
|
+
// Internal Value Types
|
|
362
|
+
|
|
363
|
+
class NullValue {
|
|
364
|
+
constructor(cell) {
|
|
365
|
+
this.model = {
|
|
366
|
+
address: cell.address,
|
|
367
|
+
type: Cell.Types.Null,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
get value() {
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
set value(value) {
|
|
376
|
+
// nothing to do
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
get type() {
|
|
380
|
+
return Cell.Types.Null;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
get effectiveType() {
|
|
384
|
+
return Cell.Types.Null;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
get address() {
|
|
388
|
+
return this.model.address;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
set address(value) {
|
|
392
|
+
this.model.address = value;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
toCsvString() {
|
|
396
|
+
return '';
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
release() {}
|
|
400
|
+
|
|
401
|
+
toString() {
|
|
402
|
+
return '';
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
class NumberValue {
|
|
407
|
+
constructor(cell, value) {
|
|
408
|
+
this.model = {
|
|
409
|
+
address: cell.address,
|
|
410
|
+
type: Cell.Types.Number,
|
|
411
|
+
value,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
get value() {
|
|
416
|
+
return this.model.value;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
set value(value) {
|
|
420
|
+
this.model.value = value;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
get type() {
|
|
424
|
+
return Cell.Types.Number;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
get effectiveType() {
|
|
428
|
+
return Cell.Types.Number;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
get address() {
|
|
432
|
+
return this.model.address;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
set address(value) {
|
|
436
|
+
this.model.address = value;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
toCsvString() {
|
|
440
|
+
return this.model.value.toString();
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
release() {}
|
|
444
|
+
|
|
445
|
+
toString() {
|
|
446
|
+
return this.model.value.toString();
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
class StringValue {
|
|
451
|
+
constructor(cell, value) {
|
|
452
|
+
this.model = {
|
|
453
|
+
address: cell.address,
|
|
454
|
+
type: Cell.Types.String,
|
|
455
|
+
value,
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
get value() {
|
|
460
|
+
return this.model.value;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
set value(value) {
|
|
464
|
+
this.model.value = value;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
get type() {
|
|
468
|
+
return Cell.Types.String;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
get effectiveType() {
|
|
472
|
+
return Cell.Types.String;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
get address() {
|
|
476
|
+
return this.model.address;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
set address(value) {
|
|
480
|
+
this.model.address = value;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
toCsvString() {
|
|
484
|
+
return `"${this.model.value.replace(/"/g, '""')}"`;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
release() {}
|
|
488
|
+
|
|
489
|
+
toString() {
|
|
490
|
+
return this.model.value;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
class RichTextValue {
|
|
495
|
+
constructor(cell, value) {
|
|
496
|
+
this.model = {
|
|
497
|
+
address: cell.address,
|
|
498
|
+
type: Cell.Types.String,
|
|
499
|
+
value,
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
get value() {
|
|
504
|
+
return this.model.value;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
set value(value) {
|
|
508
|
+
this.model.value = value;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
toString() {
|
|
512
|
+
return this.model.value.richText.map(t => t.text).join('');
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
get type() {
|
|
516
|
+
return Cell.Types.RichText;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
get effectiveType() {
|
|
520
|
+
return Cell.Types.RichText;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
get address() {
|
|
524
|
+
return this.model.address;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
set address(value) {
|
|
528
|
+
this.model.address = value;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
toCsvString() {
|
|
532
|
+
return `"${this.text.replace(/"/g, '""')}"`;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
release() {}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
class DateValue {
|
|
539
|
+
constructor(cell, value) {
|
|
540
|
+
this.model = {
|
|
541
|
+
address: cell.address,
|
|
542
|
+
type: Cell.Types.Date,
|
|
543
|
+
value,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
get value() {
|
|
548
|
+
return this.model.value;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
set value(value) {
|
|
552
|
+
this.model.value = value;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
get type() {
|
|
556
|
+
return Cell.Types.Date;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
get effectiveType() {
|
|
560
|
+
return Cell.Types.Date;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
get address() {
|
|
564
|
+
return this.model.address;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
set address(value) {
|
|
568
|
+
this.model.address = value;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
toCsvString() {
|
|
572
|
+
return this.model.value.toISOString();
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
release() {}
|
|
576
|
+
|
|
577
|
+
toString() {
|
|
578
|
+
return this.model.value.toString();
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
class HyperlinkValue {
|
|
583
|
+
constructor(cell, value) {
|
|
584
|
+
this.model = {
|
|
585
|
+
address: cell.address,
|
|
586
|
+
type: Cell.Types.Hyperlink,
|
|
587
|
+
text: value ? value.text : undefined,
|
|
588
|
+
hyperlink: value ? value.hyperlink : undefined,
|
|
589
|
+
};
|
|
590
|
+
if (value && value.tooltip) {
|
|
591
|
+
this.model.tooltip = value.tooltip;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
get value() {
|
|
596
|
+
const v = {
|
|
597
|
+
text: this.model.text,
|
|
598
|
+
hyperlink: this.model.hyperlink,
|
|
599
|
+
};
|
|
600
|
+
if (this.model.tooltip) {
|
|
601
|
+
v.tooltip = this.model.tooltip;
|
|
602
|
+
}
|
|
603
|
+
return v;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
set value(value) {
|
|
607
|
+
this.model = {
|
|
608
|
+
text: value.text,
|
|
609
|
+
hyperlink: value.hyperlink,
|
|
610
|
+
};
|
|
611
|
+
if (value.tooltip) {
|
|
612
|
+
this.model.tooltip = value.tooltip;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
get text() {
|
|
617
|
+
return this.model.text;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
set text(value) {
|
|
621
|
+
this.model.text = value;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/*
|
|
625
|
+
get tooltip() {
|
|
626
|
+
return this.model.tooltip;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
set tooltip(value) {
|
|
630
|
+
this.model.tooltip = value;
|
|
631
|
+
} */
|
|
632
|
+
|
|
633
|
+
get hyperlink() {
|
|
634
|
+
return this.model.hyperlink;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
set hyperlink(value) {
|
|
638
|
+
this.model.hyperlink = value;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
get type() {
|
|
642
|
+
return Cell.Types.Hyperlink;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
get effectiveType() {
|
|
646
|
+
return Cell.Types.Hyperlink;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
get address() {
|
|
650
|
+
return this.model.address;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
set address(value) {
|
|
654
|
+
this.model.address = value;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
toCsvString() {
|
|
658
|
+
return this.model.hyperlink;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
release() {}
|
|
662
|
+
|
|
663
|
+
toString() {
|
|
664
|
+
return this.model.text;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
class MergeValue {
|
|
669
|
+
constructor(cell, master) {
|
|
670
|
+
this.model = {
|
|
671
|
+
address: cell.address,
|
|
672
|
+
type: Cell.Types.Merge,
|
|
673
|
+
master: master ? master.address : undefined,
|
|
674
|
+
};
|
|
675
|
+
this._master = master;
|
|
676
|
+
if (master) {
|
|
677
|
+
master.addMergeRef();
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
get value() {
|
|
682
|
+
return this._master.value;
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
set value(value) {
|
|
686
|
+
if (value instanceof Cell) {
|
|
687
|
+
if (this._master) {
|
|
688
|
+
this._master.releaseMergeRef();
|
|
689
|
+
}
|
|
690
|
+
value.addMergeRef();
|
|
691
|
+
this._master = value;
|
|
692
|
+
} else {
|
|
693
|
+
this._master.value = value;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
isMergedTo(master) {
|
|
698
|
+
return master === this._master;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
get master() {
|
|
702
|
+
return this._master;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
get type() {
|
|
706
|
+
return Cell.Types.Merge;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
get effectiveType() {
|
|
710
|
+
return this._master.effectiveType;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
get address() {
|
|
714
|
+
return this.model.address;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
set address(value) {
|
|
718
|
+
this.model.address = value;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
toCsvString() {
|
|
722
|
+
return '';
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
release() {
|
|
726
|
+
this._master.releaseMergeRef();
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
toString() {
|
|
730
|
+
return this.value.toString();
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
class FormulaValue {
|
|
735
|
+
constructor(cell, value) {
|
|
736
|
+
this.cell = cell;
|
|
737
|
+
|
|
738
|
+
this.model = {
|
|
739
|
+
address: cell.address,
|
|
740
|
+
type: Cell.Types.Formula,
|
|
741
|
+
shareType: value ? value.shareType : undefined,
|
|
742
|
+
ref: value ? value.ref : undefined,
|
|
743
|
+
formula: value ? value.formula : undefined,
|
|
744
|
+
sharedFormula: value ? value.sharedFormula : undefined,
|
|
745
|
+
result: value ? value.result : undefined,
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
_copyModel(model) {
|
|
750
|
+
const copy = {};
|
|
751
|
+
const cp = name => {
|
|
752
|
+
const value = model[name];
|
|
753
|
+
if (value) {
|
|
754
|
+
copy[name] = value;
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
cp('formula');
|
|
758
|
+
cp('result');
|
|
759
|
+
cp('ref');
|
|
760
|
+
cp('shareType');
|
|
761
|
+
cp('sharedFormula');
|
|
762
|
+
return copy;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
get value() {
|
|
766
|
+
return this._copyModel(this.model);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
set value(value) {
|
|
770
|
+
this.model = this._copyModel(value);
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
validate(value) {
|
|
774
|
+
switch (Value.getType(value)) {
|
|
775
|
+
case Cell.Types.Null:
|
|
776
|
+
case Cell.Types.String:
|
|
777
|
+
case Cell.Types.Number:
|
|
778
|
+
case Cell.Types.Date:
|
|
779
|
+
break;
|
|
780
|
+
case Cell.Types.Hyperlink:
|
|
781
|
+
case Cell.Types.Formula:
|
|
782
|
+
default:
|
|
783
|
+
throw new Error('Cannot process that type of result value');
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
get dependencies() {
|
|
788
|
+
// find all the ranges and cells mentioned in the formula
|
|
789
|
+
const ranges = this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g);
|
|
790
|
+
const cells = this.formula
|
|
791
|
+
.replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g, '')
|
|
792
|
+
.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}/g);
|
|
793
|
+
return {
|
|
794
|
+
ranges,
|
|
795
|
+
cells,
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
get formula() {
|
|
800
|
+
return this.model.formula || this._getTranslatedFormula();
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
set formula(value) {
|
|
804
|
+
this.model.formula = value;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
get formulaType() {
|
|
808
|
+
if (this.model.formula) {
|
|
809
|
+
return Enums.FormulaType.Master;
|
|
810
|
+
}
|
|
811
|
+
if (this.model.sharedFormula) {
|
|
812
|
+
return Enums.FormulaType.Shared;
|
|
813
|
+
}
|
|
814
|
+
return Enums.FormulaType.None;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
get result() {
|
|
818
|
+
return this.model.result;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
set result(value) {
|
|
822
|
+
this.model.result = value;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
get type() {
|
|
826
|
+
return Cell.Types.Formula;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
get effectiveType() {
|
|
830
|
+
const v = this.model.result;
|
|
831
|
+
if (v === null || v === undefined) {
|
|
832
|
+
return Enums.ValueType.Null;
|
|
833
|
+
}
|
|
834
|
+
if (v instanceof String || typeof v === 'string') {
|
|
835
|
+
return Enums.ValueType.String;
|
|
836
|
+
}
|
|
837
|
+
if (typeof v === 'number') {
|
|
838
|
+
return Enums.ValueType.Number;
|
|
839
|
+
}
|
|
840
|
+
if (v instanceof Date) {
|
|
841
|
+
return Enums.ValueType.Date;
|
|
842
|
+
}
|
|
843
|
+
if (v.text && v.hyperlink) {
|
|
844
|
+
return Enums.ValueType.Hyperlink;
|
|
845
|
+
}
|
|
846
|
+
if (v.formula) {
|
|
847
|
+
return Enums.ValueType.Formula;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
return Enums.ValueType.Null;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
get address() {
|
|
854
|
+
return this.model.address;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
set address(value) {
|
|
858
|
+
this.model.address = value;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
_getTranslatedFormula() {
|
|
862
|
+
if (!this._translatedFormula && this.model.sharedFormula) {
|
|
863
|
+
const {worksheet} = this.cell;
|
|
864
|
+
const master = worksheet.findCell(this.model.sharedFormula);
|
|
865
|
+
this._translatedFormula =
|
|
866
|
+
master && slideFormula(master.formula, master.address, this.model.address);
|
|
867
|
+
}
|
|
868
|
+
return this._translatedFormula;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
toCsvString() {
|
|
872
|
+
return `${this.model.result || ''}`;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
release() {}
|
|
876
|
+
|
|
877
|
+
toString() {
|
|
878
|
+
return this.model.result ? this.model.result.toString() : '';
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
class SharedStringValue {
|
|
883
|
+
constructor(cell, value) {
|
|
884
|
+
this.model = {
|
|
885
|
+
address: cell.address,
|
|
886
|
+
type: Cell.Types.SharedString,
|
|
887
|
+
value,
|
|
888
|
+
};
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
get value() {
|
|
892
|
+
return this.model.value;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
set value(value) {
|
|
896
|
+
this.model.value = value;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
get type() {
|
|
900
|
+
return Cell.Types.SharedString;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
get effectiveType() {
|
|
904
|
+
return Cell.Types.SharedString;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
get address() {
|
|
908
|
+
return this.model.address;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
set address(value) {
|
|
912
|
+
this.model.address = value;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
toCsvString() {
|
|
916
|
+
return this.model.value.toString();
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
release() {}
|
|
920
|
+
|
|
921
|
+
toString() {
|
|
922
|
+
return this.model.value.toString();
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
class BooleanValue {
|
|
927
|
+
constructor(cell, value) {
|
|
928
|
+
this.model = {
|
|
929
|
+
address: cell.address,
|
|
930
|
+
type: Cell.Types.Boolean,
|
|
931
|
+
value,
|
|
932
|
+
};
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
get value() {
|
|
936
|
+
return this.model.value;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
set value(value) {
|
|
940
|
+
this.model.value = value;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
get type() {
|
|
944
|
+
return Cell.Types.Boolean;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
get effectiveType() {
|
|
948
|
+
return Cell.Types.Boolean;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
get address() {
|
|
952
|
+
return this.model.address;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
set address(value) {
|
|
956
|
+
this.model.address = value;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
toCsvString() {
|
|
960
|
+
return this.model.value ? 1 : 0;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
release() {}
|
|
964
|
+
|
|
965
|
+
toString() {
|
|
966
|
+
return this.model.value.toString();
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
class ErrorValue {
|
|
971
|
+
constructor(cell, value) {
|
|
972
|
+
this.model = {
|
|
973
|
+
address: cell.address,
|
|
974
|
+
type: Cell.Types.Error,
|
|
975
|
+
value,
|
|
976
|
+
};
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
get value() {
|
|
980
|
+
return this.model.value;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
set value(value) {
|
|
984
|
+
this.model.value = value;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
get type() {
|
|
988
|
+
return Cell.Types.Error;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
get effectiveType() {
|
|
992
|
+
return Cell.Types.Error;
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
get address() {
|
|
996
|
+
return this.model.address;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
set address(value) {
|
|
1000
|
+
this.model.address = value;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
toCsvString() {
|
|
1004
|
+
return this.toString();
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
release() {}
|
|
1008
|
+
|
|
1009
|
+
toString() {
|
|
1010
|
+
return this.model.value.error.toString();
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
class JSONValue {
|
|
1015
|
+
constructor(cell, value) {
|
|
1016
|
+
this.model = {
|
|
1017
|
+
address: cell.address,
|
|
1018
|
+
type: Cell.Types.String,
|
|
1019
|
+
value: JSON.stringify(value),
|
|
1020
|
+
rawValue: value,
|
|
1021
|
+
};
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
get value() {
|
|
1025
|
+
return this.model.rawValue;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
set value(value) {
|
|
1029
|
+
this.model.rawValue = value;
|
|
1030
|
+
this.model.value = JSON.stringify(value);
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
get type() {
|
|
1034
|
+
return Cell.Types.String;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
get effectiveType() {
|
|
1038
|
+
return Cell.Types.String;
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
get address() {
|
|
1042
|
+
return this.model.address;
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
set address(value) {
|
|
1046
|
+
this.model.address = value;
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
toCsvString() {
|
|
1050
|
+
return this.model.value;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
release() {}
|
|
1054
|
+
|
|
1055
|
+
toString() {
|
|
1056
|
+
return this.model.value;
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
// Value is a place to hold common static Value type functions
|
|
1061
|
+
const Value = {
|
|
1062
|
+
getType(value) {
|
|
1063
|
+
if (value === null || value === undefined) {
|
|
1064
|
+
return Cell.Types.Null;
|
|
1065
|
+
}
|
|
1066
|
+
if (value instanceof String || typeof value === 'string') {
|
|
1067
|
+
return Cell.Types.String;
|
|
1068
|
+
}
|
|
1069
|
+
if (typeof value === 'number') {
|
|
1070
|
+
return Cell.Types.Number;
|
|
1071
|
+
}
|
|
1072
|
+
if (typeof value === 'boolean') {
|
|
1073
|
+
return Cell.Types.Boolean;
|
|
1074
|
+
}
|
|
1075
|
+
if (value instanceof Date) {
|
|
1076
|
+
return Cell.Types.Date;
|
|
1077
|
+
}
|
|
1078
|
+
if (value.text && value.hyperlink) {
|
|
1079
|
+
return Cell.Types.Hyperlink;
|
|
1080
|
+
}
|
|
1081
|
+
if (value.formula || value.sharedFormula) {
|
|
1082
|
+
return Cell.Types.Formula;
|
|
1083
|
+
}
|
|
1084
|
+
if (value.richText) {
|
|
1085
|
+
return Cell.Types.RichText;
|
|
1086
|
+
}
|
|
1087
|
+
if (value.sharedString) {
|
|
1088
|
+
return Cell.Types.SharedString;
|
|
1089
|
+
}
|
|
1090
|
+
if (value.error) {
|
|
1091
|
+
return Cell.Types.Error;
|
|
1092
|
+
}
|
|
1093
|
+
return Cell.Types.JSON;
|
|
1094
|
+
},
|
|
1095
|
+
|
|
1096
|
+
// map valueType to constructor
|
|
1097
|
+
types: [
|
|
1098
|
+
{t: Cell.Types.Null, f: NullValue},
|
|
1099
|
+
{t: Cell.Types.Number, f: NumberValue},
|
|
1100
|
+
{t: Cell.Types.String, f: StringValue},
|
|
1101
|
+
{t: Cell.Types.Date, f: DateValue},
|
|
1102
|
+
{t: Cell.Types.Hyperlink, f: HyperlinkValue},
|
|
1103
|
+
{t: Cell.Types.Formula, f: FormulaValue},
|
|
1104
|
+
{t: Cell.Types.Merge, f: MergeValue},
|
|
1105
|
+
{t: Cell.Types.JSON, f: JSONValue},
|
|
1106
|
+
{t: Cell.Types.SharedString, f: SharedStringValue},
|
|
1107
|
+
{t: Cell.Types.RichText, f: RichTextValue},
|
|
1108
|
+
{t: Cell.Types.Boolean, f: BooleanValue},
|
|
1109
|
+
{t: Cell.Types.Error, f: ErrorValue},
|
|
1110
|
+
].reduce((p, t) => {
|
|
1111
|
+
p[t.t] = t.f;
|
|
1112
|
+
return p;
|
|
1113
|
+
}, []),
|
|
1114
|
+
|
|
1115
|
+
create(type, cell, value) {
|
|
1116
|
+
const T = this.types[type];
|
|
1117
|
+
if (!T) {
|
|
1118
|
+
throw new Error(`Could not create Value of type ${type}`);
|
|
1119
|
+
}
|
|
1120
|
+
return new T(cell, value);
|
|
1121
|
+
},
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1124
|
+
module.exports = Cell;
|