@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.
Files changed (185) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +3024 -0
  3. package/README_zh.md +2878 -0
  4. package/excel.js +13 -0
  5. package/index.d.ts +2040 -0
  6. package/index.ts +2 -0
  7. package/lib/csv/csv.js +191 -0
  8. package/lib/csv/line-buffer.js +74 -0
  9. package/lib/csv/stream-converter.js +135 -0
  10. package/lib/doc/anchor.js +91 -0
  11. package/lib/doc/cell.js +1124 -0
  12. package/lib/doc/column.js +320 -0
  13. package/lib/doc/data/theme1.json +234 -0
  14. package/lib/doc/data-validations.js +19 -0
  15. package/lib/doc/defined-names.js +196 -0
  16. package/lib/doc/enums.js +48 -0
  17. package/lib/doc/image.js +59 -0
  18. package/lib/doc/modelcontainer.js +18 -0
  19. package/lib/doc/note.js +65 -0
  20. package/lib/doc/pivot-table.js +132 -0
  21. package/lib/doc/range.js +257 -0
  22. package/lib/doc/row.js +415 -0
  23. package/lib/doc/table.js +465 -0
  24. package/lib/doc/workbook.js +224 -0
  25. package/lib/doc/worksheet.js +949 -0
  26. package/lib/exceljs.bare.js +13 -0
  27. package/lib/exceljs.browser.js +36 -0
  28. package/lib/exceljs.nodejs.js +14 -0
  29. package/lib/stream/xlsx/hyperlink-reader.js +83 -0
  30. package/lib/stream/xlsx/sheet-comments-writer.js +121 -0
  31. package/lib/stream/xlsx/sheet-rels-writer.js +119 -0
  32. package/lib/stream/xlsx/workbook-reader.js +337 -0
  33. package/lib/stream/xlsx/workbook-writer.js +347 -0
  34. package/lib/stream/xlsx/worksheet-reader.js +374 -0
  35. package/lib/stream/xlsx/worksheet-writer.js +717 -0
  36. package/lib/utils/auto-drain.js +15 -0
  37. package/lib/utils/browser-buffer-decode.js +14 -0
  38. package/lib/utils/browser-buffer-encode.js +15 -0
  39. package/lib/utils/cell-matrix.js +165 -0
  40. package/lib/utils/col-cache.js +287 -0
  41. package/lib/utils/copy-style.js +43 -0
  42. package/lib/utils/encryptor.js +55 -0
  43. package/lib/utils/iterate-stream.js +48 -0
  44. package/lib/utils/parse-sax.js +30 -0
  45. package/lib/utils/shared-formula.js +44 -0
  46. package/lib/utils/shared-strings.js +35 -0
  47. package/lib/utils/stream-base64.js +72 -0
  48. package/lib/utils/stream-buf.js +364 -0
  49. package/lib/utils/string-buf.js +82 -0
  50. package/lib/utils/string-builder.js +35 -0
  51. package/lib/utils/stuttered-pipe.js +67 -0
  52. package/lib/utils/typed-stack.js +24 -0
  53. package/lib/utils/under-dash.js +184 -0
  54. package/lib/utils/utils.js +205 -0
  55. package/lib/utils/xml-stream.js +169 -0
  56. package/lib/utils/zip-stream.js +87 -0
  57. package/lib/xlsx/.rels +11 -0
  58. package/lib/xlsx/calcChain.xml +6 -0
  59. package/lib/xlsx/core.xml +7 -0
  60. package/lib/xlsx/defaultnumformats.js +153 -0
  61. package/lib/xlsx/rel-type.js +20 -0
  62. package/lib/xlsx/styles.xml +41 -0
  63. package/lib/xlsx/workbook.xml +16 -0
  64. package/lib/xlsx/xform/base-xform.js +145 -0
  65. package/lib/xlsx/xform/book/defined-name-xform.js +91 -0
  66. package/lib/xlsx/xform/book/sheet-xform.js +34 -0
  67. package/lib/xlsx/xform/book/workbook-calc-properties-xform.js +26 -0
  68. package/lib/xlsx/xform/book/workbook-pivot-cache-xform.js +29 -0
  69. package/lib/xlsx/xform/book/workbook-properties-xform.js +29 -0
  70. package/lib/xlsx/xform/book/workbook-view-xform.js +53 -0
  71. package/lib/xlsx/xform/book/workbook-xform.js +259 -0
  72. package/lib/xlsx/xform/comment/comment-xform.js +105 -0
  73. package/lib/xlsx/xform/comment/comments-xform.js +82 -0
  74. package/lib/xlsx/xform/comment/style/vml-position-xform.js +39 -0
  75. package/lib/xlsx/xform/comment/style/vml-protection-xform.js +36 -0
  76. package/lib/xlsx/xform/comment/vml-anchor-xform.js +60 -0
  77. package/lib/xlsx/xform/comment/vml-client-data-xform.js +95 -0
  78. package/lib/xlsx/xform/comment/vml-notes-xform.js +107 -0
  79. package/lib/xlsx/xform/comment/vml-shape-xform.js +95 -0
  80. package/lib/xlsx/xform/comment/vml-textbox-xform.js +64 -0
  81. package/lib/xlsx/xform/composite-xform.js +56 -0
  82. package/lib/xlsx/xform/core/app-heading-pairs-xform.js +32 -0
  83. package/lib/xlsx/xform/core/app-titles-of-parts-xform.js +28 -0
  84. package/lib/xlsx/xform/core/app-xform.js +100 -0
  85. package/lib/xlsx/xform/core/content-types-xform.js +135 -0
  86. package/lib/xlsx/xform/core/core-xform.js +136 -0
  87. package/lib/xlsx/xform/core/relationship-xform.js +25 -0
  88. package/lib/xlsx/xform/core/relationships-xform.js +73 -0
  89. package/lib/xlsx/xform/drawing/base-cell-anchor-xform.js +48 -0
  90. package/lib/xlsx/xform/drawing/blip-fill-xform.js +71 -0
  91. package/lib/xlsx/xform/drawing/blip-xform.js +42 -0
  92. package/lib/xlsx/xform/drawing/c-nv-pic-pr-xform.js +38 -0
  93. package/lib/xlsx/xform/drawing/c-nv-pr-xform.js +68 -0
  94. package/lib/xlsx/xform/drawing/cell-position-xform.js +77 -0
  95. package/lib/xlsx/xform/drawing/drawing-xform.js +109 -0
  96. package/lib/xlsx/xform/drawing/ext-lst-xform.js +43 -0
  97. package/lib/xlsx/xform/drawing/ext-xform.js +44 -0
  98. package/lib/xlsx/xform/drawing/hlink-click-xform.js +41 -0
  99. package/lib/xlsx/xform/drawing/nv-pic-pr-xform.js +65 -0
  100. package/lib/xlsx/xform/drawing/one-cell-anchor-xform.js +63 -0
  101. package/lib/xlsx/xform/drawing/pic-xform.js +77 -0
  102. package/lib/xlsx/xform/drawing/sp-pr.js +17 -0
  103. package/lib/xlsx/xform/drawing/two-cell-anchor-xform.js +62 -0
  104. package/lib/xlsx/xform/list-xform.js +95 -0
  105. package/lib/xlsx/xform/pivot-table/cache-field.js +43 -0
  106. package/lib/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +77 -0
  107. package/lib/xlsx/xform/pivot-table/pivot-cache-records-xform.js +103 -0
  108. package/lib/xlsx/xform/pivot-table/pivot-table-xform.js +189 -0
  109. package/lib/xlsx/xform/sheet/auto-filter-xform.js +38 -0
  110. package/lib/xlsx/xform/sheet/cell-xform.js +498 -0
  111. package/lib/xlsx/xform/sheet/cf/cf-rule-xform.js +301 -0
  112. package/lib/xlsx/xform/sheet/cf/cfvo-xform.js +27 -0
  113. package/lib/xlsx/xform/sheet/cf/color-scale-xform.js +45 -0
  114. package/lib/xlsx/xform/sheet/cf/conditional-formatting-xform.js +48 -0
  115. package/lib/xlsx/xform/sheet/cf/conditional-formattings-xform.js +92 -0
  116. package/lib/xlsx/xform/sheet/cf/databar-xform.js +49 -0
  117. package/lib/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +87 -0
  118. package/lib/xlsx/xform/sheet/cf/formula-xform.js +25 -0
  119. package/lib/xlsx/xform/sheet/cf/icon-set-xform.js +47 -0
  120. package/lib/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +27 -0
  121. package/lib/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +98 -0
  122. package/lib/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +43 -0
  123. package/lib/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +62 -0
  124. package/lib/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +50 -0
  125. package/lib/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +98 -0
  126. package/lib/xlsx/xform/sheet/cf-ext/f-ext-xform.js +25 -0
  127. package/lib/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +73 -0
  128. package/lib/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +25 -0
  129. package/lib/xlsx/xform/sheet/col-xform.js +86 -0
  130. package/lib/xlsx/xform/sheet/data-validations-xform.js +257 -0
  131. package/lib/xlsx/xform/sheet/dimension-xform.js +29 -0
  132. package/lib/xlsx/xform/sheet/drawing-xform.js +33 -0
  133. package/lib/xlsx/xform/sheet/ext-lst-xform.js +86 -0
  134. package/lib/xlsx/xform/sheet/header-footer-xform.js +146 -0
  135. package/lib/xlsx/xform/sheet/hyperlink-xform.js +54 -0
  136. package/lib/xlsx/xform/sheet/merge-cell-xform.js +27 -0
  137. package/lib/xlsx/xform/sheet/merges.js +56 -0
  138. package/lib/xlsx/xform/sheet/outline-properties-xform.js +43 -0
  139. package/lib/xlsx/xform/sheet/page-breaks-xform.js +27 -0
  140. package/lib/xlsx/xform/sheet/page-margins-xform.js +49 -0
  141. package/lib/xlsx/xform/sheet/page-setup-properties-xform.js +35 -0
  142. package/lib/xlsx/xform/sheet/page-setup-xform.js +103 -0
  143. package/lib/xlsx/xform/sheet/picture-xform.js +33 -0
  144. package/lib/xlsx/xform/sheet/print-options-xform.js +49 -0
  145. package/lib/xlsx/xform/sheet/row-breaks-xform.js +39 -0
  146. package/lib/xlsx/xform/sheet/row-xform.js +142 -0
  147. package/lib/xlsx/xform/sheet/sheet-format-properties-xform.js +55 -0
  148. package/lib/xlsx/xform/sheet/sheet-properties-xform.js +90 -0
  149. package/lib/xlsx/xform/sheet/sheet-protection-xform.js +89 -0
  150. package/lib/xlsx/xform/sheet/sheet-view-xform.js +202 -0
  151. package/lib/xlsx/xform/sheet/table-part-xform.js +33 -0
  152. package/lib/xlsx/xform/sheet/worksheet-xform.js +548 -0
  153. package/lib/xlsx/xform/simple/boolean-xform.js +31 -0
  154. package/lib/xlsx/xform/simple/date-xform.js +66 -0
  155. package/lib/xlsx/xform/simple/float-xform.js +51 -0
  156. package/lib/xlsx/xform/simple/integer-xform.js +57 -0
  157. package/lib/xlsx/xform/simple/string-xform.js +51 -0
  158. package/lib/xlsx/xform/static-xform.js +64 -0
  159. package/lib/xlsx/xform/strings/phonetic-text-xform.js +98 -0
  160. package/lib/xlsx/xform/strings/rich-text-xform.js +101 -0
  161. package/lib/xlsx/xform/strings/shared-string-xform.js +102 -0
  162. package/lib/xlsx/xform/strings/shared-strings-xform.js +127 -0
  163. package/lib/xlsx/xform/strings/text-xform.js +44 -0
  164. package/lib/xlsx/xform/style/alignment-xform.js +172 -0
  165. package/lib/xlsx/xform/style/border-xform.js +207 -0
  166. package/lib/xlsx/xform/style/color-xform.js +63 -0
  167. package/lib/xlsx/xform/style/dxf-xform.js +111 -0
  168. package/lib/xlsx/xform/style/fill-xform.js +364 -0
  169. package/lib/xlsx/xform/style/font-xform.js +102 -0
  170. package/lib/xlsx/xform/style/numfmt-xform.js +63 -0
  171. package/lib/xlsx/xform/style/protection-xform.js +60 -0
  172. package/lib/xlsx/xform/style/style-xform.js +125 -0
  173. package/lib/xlsx/xform/style/styles-xform.js +527 -0
  174. package/lib/xlsx/xform/style/underline-xform.js +47 -0
  175. package/lib/xlsx/xform/table/auto-filter-xform.js +81 -0
  176. package/lib/xlsx/xform/table/custom-filter-xform.js +33 -0
  177. package/lib/xlsx/xform/table/filter-column-xform.js +96 -0
  178. package/lib/xlsx/xform/table/filter-xform.js +31 -0
  179. package/lib/xlsx/xform/table/table-column-xform.js +44 -0
  180. package/lib/xlsx/xform/table/table-style-info-xform.js +41 -0
  181. package/lib/xlsx/xform/table/table-xform.js +131 -0
  182. package/lib/xlsx/xlsx.js +774 -0
  183. package/lib/xlsx/xml/theme1.js +3 -0
  184. package/lib/xlsx/xml/theme1.xml +318 -0
  185. package/package.json +149 -0
@@ -0,0 +1,257 @@
1
+ const colCache = require('../utils/col-cache');
2
+
3
+ // used by worksheet to calculate sheet dimensions
4
+ class Range {
5
+ constructor() {
6
+ this.decode(arguments);
7
+ }
8
+
9
+ setTLBR(t, l, b, r, s) {
10
+ if (arguments.length < 4) {
11
+ // setTLBR(tl, br, s)
12
+ const tl = colCache.decodeAddress(t);
13
+ const br = colCache.decodeAddress(l);
14
+ this.model = {
15
+ top: Math.min(tl.row, br.row),
16
+ left: Math.min(tl.col, br.col),
17
+ bottom: Math.max(tl.row, br.row),
18
+ right: Math.max(tl.col, br.col),
19
+ sheetName: b,
20
+ };
21
+
22
+ this.setTLBR(tl.row, tl.col, br.row, br.col, s);
23
+ } else {
24
+ // setTLBR(t, l, b, r, s)
25
+ this.model = {
26
+ top: Math.min(t, b),
27
+ left: Math.min(l, r),
28
+ bottom: Math.max(t, b),
29
+ right: Math.max(l, r),
30
+ sheetName: s,
31
+ };
32
+ }
33
+ }
34
+
35
+ decode(argv) {
36
+ switch (argv.length) {
37
+ case 5: // [t,l,b,r,s]
38
+ this.setTLBR(argv[0], argv[1], argv[2], argv[3], argv[4]);
39
+ break;
40
+ case 4: // [t,l,b,r]
41
+ this.setTLBR(argv[0], argv[1], argv[2], argv[3]);
42
+ break;
43
+
44
+ case 3: // [tl,br,s]
45
+ this.setTLBR(argv[0], argv[1], argv[2]);
46
+ break;
47
+ case 2: // [tl,br]
48
+ this.setTLBR(argv[0], argv[1]);
49
+ break;
50
+
51
+ case 1: {
52
+ const value = argv[0];
53
+ if (value instanceof Range) {
54
+ // copy constructor
55
+ this.model = {
56
+ top: value.model.top,
57
+ left: value.model.left,
58
+ bottom: value.model.bottom,
59
+ right: value.model.right,
60
+ sheetName: value.sheetName,
61
+ };
62
+ } else if (value instanceof Array) {
63
+ // an arguments array
64
+ this.decode(value);
65
+ } else if (value.top && value.left && value.bottom && value.right) {
66
+ // a model
67
+ this.model = {
68
+ top: value.top,
69
+ left: value.left,
70
+ bottom: value.bottom,
71
+ right: value.right,
72
+ sheetName: value.sheetName,
73
+ };
74
+ } else {
75
+ // [sheetName!]tl:br
76
+ const tlbr = colCache.decodeEx(value);
77
+ if (tlbr.top) {
78
+ this.model = {
79
+ top: tlbr.top,
80
+ left: tlbr.left,
81
+ bottom: tlbr.bottom,
82
+ right: tlbr.right,
83
+ sheetName: tlbr.sheetName,
84
+ };
85
+ } else {
86
+ this.model = {
87
+ top: tlbr.row,
88
+ left: tlbr.col,
89
+ bottom: tlbr.row,
90
+ right: tlbr.col,
91
+ sheetName: tlbr.sheetName,
92
+ };
93
+ }
94
+ }
95
+ break;
96
+ }
97
+
98
+ case 0:
99
+ this.model = {
100
+ top: 0,
101
+ left: 0,
102
+ bottom: 0,
103
+ right: 0,
104
+ };
105
+ break;
106
+
107
+ default:
108
+ throw new Error(`Invalid number of arguments to _getDimensions() - ${argv.length}`);
109
+ }
110
+ }
111
+
112
+ get top() {
113
+ return this.model.top || 1;
114
+ }
115
+
116
+ set top(value) {
117
+ this.model.top = value;
118
+ }
119
+
120
+ get left() {
121
+ return this.model.left || 1;
122
+ }
123
+
124
+ set left(value) {
125
+ this.model.left = value;
126
+ }
127
+
128
+ get bottom() {
129
+ return this.model.bottom || 1;
130
+ }
131
+
132
+ set bottom(value) {
133
+ this.model.bottom = value;
134
+ }
135
+
136
+ get right() {
137
+ return this.model.right || 1;
138
+ }
139
+
140
+ set right(value) {
141
+ this.model.right = value;
142
+ }
143
+
144
+ get sheetName() {
145
+ return this.model.sheetName;
146
+ }
147
+
148
+ set sheetName(value) {
149
+ this.model.sheetName = value;
150
+ }
151
+
152
+ get _serialisedSheetName() {
153
+ const {sheetName} = this.model;
154
+ if (sheetName) {
155
+ if (/^[a-zA-Z0-9]*$/.test(sheetName)) {
156
+ return `${sheetName}!`;
157
+ }
158
+ return `'${sheetName}'!`;
159
+ }
160
+ return '';
161
+ }
162
+
163
+ expand(top, left, bottom, right) {
164
+ if (!this.model.top || top < this.top) this.top = top;
165
+ if (!this.model.left || left < this.left) this.left = left;
166
+ if (!this.model.bottom || bottom > this.bottom) this.bottom = bottom;
167
+ if (!this.model.right || right > this.right) this.right = right;
168
+ }
169
+
170
+ expandRow(row) {
171
+ if (row) {
172
+ const {dimensions, number} = row;
173
+ if (dimensions) {
174
+ this.expand(number, dimensions.min, number, dimensions.max);
175
+ }
176
+ }
177
+ }
178
+
179
+ expandToAddress(addressStr) {
180
+ const address = colCache.decodeEx(addressStr);
181
+ this.expand(address.row, address.col, address.row, address.col);
182
+ }
183
+
184
+ get tl() {
185
+ return colCache.n2l(this.left) + this.top;
186
+ }
187
+
188
+ get $t$l() {
189
+ return `$${colCache.n2l(this.left)}$${this.top}`;
190
+ }
191
+
192
+ get br() {
193
+ return colCache.n2l(this.right) + this.bottom;
194
+ }
195
+
196
+ get $b$r() {
197
+ return `$${colCache.n2l(this.right)}$${this.bottom}`;
198
+ }
199
+
200
+ get range() {
201
+ return `${this._serialisedSheetName + this.tl}:${this.br}`;
202
+ }
203
+
204
+ get $range() {
205
+ return `${this._serialisedSheetName + this.$t$l}:${this.$b$r}`;
206
+ }
207
+
208
+ get shortRange() {
209
+ return this.count > 1 ? this.range : this._serialisedSheetName + this.tl;
210
+ }
211
+
212
+ get $shortRange() {
213
+ return this.count > 1 ? this.$range : this._serialisedSheetName + this.$t$l;
214
+ }
215
+
216
+ get count() {
217
+ return (1 + this.bottom - this.top) * (1 + this.right - this.left);
218
+ }
219
+
220
+ toString() {
221
+ return this.range;
222
+ }
223
+
224
+ intersects(other) {
225
+ if (other.sheetName && this.sheetName && other.sheetName !== this.sheetName) return false;
226
+ if (other.bottom < this.top) return false;
227
+ if (other.top > this.bottom) return false;
228
+ if (other.right < this.left) return false;
229
+ if (other.left > this.right) return false;
230
+ return true;
231
+ }
232
+
233
+ contains(addressStr) {
234
+ const address = colCache.decodeEx(addressStr);
235
+ return this.containsEx(address);
236
+ }
237
+
238
+ containsEx(address) {
239
+ if (address.sheetName && this.sheetName && address.sheetName !== this.sheetName) return false;
240
+ return (
241
+ address.row >= this.top &&
242
+ address.row <= this.bottom &&
243
+ address.col >= this.left &&
244
+ address.col <= this.right
245
+ );
246
+ }
247
+
248
+ forEachAddress(cb) {
249
+ for (let col = this.left; col <= this.right; col++) {
250
+ for (let row = this.top; row <= this.bottom; row++) {
251
+ cb(colCache.encodeAddress(row, col), row, col);
252
+ }
253
+ }
254
+ }
255
+ }
256
+
257
+ module.exports = Range;
package/lib/doc/row.js ADDED
@@ -0,0 +1,415 @@
1
+ 'use strict';
2
+
3
+ const _ = require('../utils/under-dash');
4
+
5
+ const Enums = require('./enums');
6
+ const colCache = require('../utils/col-cache');
7
+ const Cell = require('./cell');
8
+
9
+ class Row {
10
+ constructor(worksheet, number) {
11
+ this._worksheet = worksheet;
12
+ this._number = number;
13
+ this._cells = [];
14
+ this.style = {};
15
+ this.outlineLevel = 0;
16
+ }
17
+
18
+ // return the row number
19
+ get number() {
20
+ return this._number;
21
+ }
22
+
23
+ get worksheet() {
24
+ return this._worksheet;
25
+ }
26
+
27
+ // Inform Streaming Writer that this row (and all rows before it) are complete
28
+ // and ready to write. Has no effect on Worksheet document
29
+ commit() {
30
+ this._worksheet._commitRow(this); // eslint-disable-line no-underscore-dangle
31
+ }
32
+
33
+ // helps GC by breaking cyclic references
34
+ destroy() {
35
+ delete this._worksheet;
36
+ delete this._cells;
37
+ delete this.style;
38
+ }
39
+
40
+ findCell(colNumber) {
41
+ return this._cells[colNumber - 1];
42
+ }
43
+
44
+ // given {address, row, col}, find or create new cell
45
+ getCellEx(address) {
46
+ let cell = this._cells[address.col - 1];
47
+ if (!cell) {
48
+ const column = this._worksheet.getColumn(address.col);
49
+ cell = new Cell(this, column, address.address);
50
+ this._cells[address.col - 1] = cell;
51
+ }
52
+ return cell;
53
+ }
54
+
55
+ // get cell by key, letter or column number
56
+ getCell(col) {
57
+ if (typeof col === 'string') {
58
+ // is it a key?
59
+ const column = this._worksheet.getColumnKey(col);
60
+ if (column) {
61
+ col = column.number;
62
+ } else {
63
+ col = colCache.l2n(col);
64
+ }
65
+ }
66
+ return (
67
+ this._cells[col - 1] ||
68
+ this.getCellEx({
69
+ address: colCache.encodeAddress(this._number, col),
70
+ row: this._number,
71
+ col,
72
+ })
73
+ );
74
+ }
75
+
76
+ // remove cell(s) and shift all higher cells down by count
77
+ splice(start, count, ...inserts) {
78
+ const nKeep = start + count;
79
+ const nExpand = inserts.length - count;
80
+ const nEnd = this._cells.length;
81
+ let i;
82
+ let cSrc;
83
+ let cDst;
84
+
85
+ if (nExpand < 0) {
86
+ // remove cells
87
+ for (i = start + inserts.length; i <= nEnd; i++) {
88
+ cDst = this._cells[i - 1];
89
+ cSrc = this._cells[i - nExpand - 1];
90
+ if (cSrc) {
91
+ cDst = this.getCell(i);
92
+ cDst.value = cSrc.value;
93
+ cDst.style = cSrc.style;
94
+ // eslint-disable-next-line no-underscore-dangle
95
+ cDst._comment = cSrc._comment;
96
+ } else if (cDst) {
97
+ cDst.value = null;
98
+ cDst.style = {};
99
+ // eslint-disable-next-line no-underscore-dangle
100
+ cDst._comment = undefined;
101
+ }
102
+ }
103
+ } else if (nExpand > 0) {
104
+ // insert new cells
105
+ for (i = nEnd; i >= nKeep; i--) {
106
+ cSrc = this._cells[i - 1];
107
+ if (cSrc) {
108
+ cDst = this.getCell(i + nExpand);
109
+ cDst.value = cSrc.value;
110
+ cDst.style = cSrc.style;
111
+ // eslint-disable-next-line no-underscore-dangle
112
+ cDst._comment = cSrc._comment;
113
+ } else {
114
+ this._cells[i + nExpand - 1] = undefined;
115
+ }
116
+ }
117
+ }
118
+
119
+ // now add the new values
120
+ for (i = 0; i < inserts.length; i++) {
121
+ cDst = this.getCell(start + i);
122
+ cDst.value = inserts[i];
123
+ cDst.style = {};
124
+ // eslint-disable-next-line no-underscore-dangle
125
+ cDst._comment = undefined;
126
+ }
127
+ }
128
+
129
+ // Iterate over all non-null cells in this row
130
+ eachCell(options, iteratee) {
131
+ if (!iteratee) {
132
+ iteratee = options;
133
+ options = null;
134
+ }
135
+ if (options && options.includeEmpty) {
136
+ const n = this._cells.length;
137
+ for (let i = 1; i <= n; i++) {
138
+ iteratee(this.getCell(i), i);
139
+ }
140
+ } else {
141
+ this._cells.forEach((cell, index) => {
142
+ if (cell && cell.type !== Enums.ValueType.Null) {
143
+ iteratee(cell, index + 1);
144
+ }
145
+ });
146
+ }
147
+ }
148
+
149
+ // ===========================================================================
150
+ // Page Breaks
151
+ addPageBreak(lft, rght) {
152
+ const ws = this._worksheet;
153
+ const left = Math.max(0, lft - 1) || 0;
154
+ const right = Math.max(0, rght - 1) || 16838;
155
+ const pb = {
156
+ id: this._number,
157
+ max: right,
158
+ man: 1,
159
+ };
160
+ if (left) pb.min = left;
161
+
162
+ ws.rowBreaks.push(pb);
163
+ }
164
+
165
+ // return a sparse array of cell values
166
+ get values() {
167
+ const values = [];
168
+ this._cells.forEach(cell => {
169
+ if (cell && cell.type !== Enums.ValueType.Null) {
170
+ values[cell.col] = cell.value;
171
+ }
172
+ });
173
+ return values;
174
+ }
175
+
176
+ // set the values by contiguous or sparse array, or by key'd object literal
177
+ set values(value) {
178
+ // this operation is not additive - any prior cells are removed
179
+ this._cells = [];
180
+ if (!value) {
181
+ // empty row
182
+ } else if (value instanceof Array) {
183
+ let offset = 0;
184
+ if (value.hasOwnProperty('0')) {
185
+ // contiguous array - start at column 1
186
+ offset = 1;
187
+ }
188
+ value.forEach((item, index) => {
189
+ if (item !== undefined) {
190
+ this.getCellEx({
191
+ address: colCache.encodeAddress(this._number, index + offset),
192
+ row: this._number,
193
+ col: index + offset,
194
+ }).value = item;
195
+ }
196
+ });
197
+ } else {
198
+ // assume object with column keys
199
+ this._worksheet.eachColumnKey((column, key) => {
200
+ if (value[key] !== undefined) {
201
+ this.getCellEx({
202
+ address: colCache.encodeAddress(this._number, column.number),
203
+ row: this._number,
204
+ col: column.number,
205
+ }).value = value[key];
206
+ }
207
+ });
208
+ }
209
+ }
210
+
211
+ // returns true if the row includes at least one cell with a value
212
+ get hasValues() {
213
+ return _.some(this._cells, cell => cell && cell.type !== Enums.ValueType.Null);
214
+ }
215
+
216
+ get cellCount() {
217
+ return this._cells.length;
218
+ }
219
+
220
+ get actualCellCount() {
221
+ let count = 0;
222
+ this.eachCell(() => {
223
+ count++;
224
+ });
225
+ return count;
226
+ }
227
+
228
+ // get the min and max column number for the non-null cells in this row or null
229
+ get dimensions() {
230
+ let min = 0;
231
+ let max = 0;
232
+ this._cells.forEach(cell => {
233
+ if (cell && cell.type !== Enums.ValueType.Null) {
234
+ if (!min || min > cell.col) {
235
+ min = cell.col;
236
+ }
237
+ if (max < cell.col) {
238
+ max = cell.col;
239
+ }
240
+ }
241
+ });
242
+ return min > 0
243
+ ? {
244
+ min,
245
+ max,
246
+ }
247
+ : null;
248
+ }
249
+
250
+ // =========================================================================
251
+ // styles
252
+ _applyStyle(name, value) {
253
+ this.style[name] = value;
254
+ this._cells.forEach(cell => {
255
+ if (cell) {
256
+ cell[name] = value;
257
+ }
258
+ });
259
+ return value;
260
+ }
261
+
262
+ get numFmt() {
263
+ return this.style.numFmt;
264
+ }
265
+
266
+ set numFmt(value) {
267
+ this._applyStyle('numFmt', value);
268
+ }
269
+
270
+ get font() {
271
+ return this.style.font;
272
+ }
273
+
274
+ set font(value) {
275
+ this._applyStyle('font', value);
276
+ }
277
+
278
+ get alignment() {
279
+ return this.style.alignment;
280
+ }
281
+
282
+ set alignment(value) {
283
+ this._applyStyle('alignment', value);
284
+ }
285
+
286
+ get protection() {
287
+ return this.style.protection;
288
+ }
289
+
290
+ set protection(value) {
291
+ this._applyStyle('protection', value);
292
+ }
293
+
294
+ get border() {
295
+ return this.style.border;
296
+ }
297
+
298
+ set border(value) {
299
+ this._applyStyle('border', value);
300
+ }
301
+
302
+ get fill() {
303
+ return this.style.fill;
304
+ }
305
+
306
+ set fill(value) {
307
+ this._applyStyle('fill', value);
308
+ }
309
+
310
+ get hidden() {
311
+ return !!this._hidden;
312
+ }
313
+
314
+ set hidden(value) {
315
+ this._hidden = value;
316
+ }
317
+
318
+ get outlineLevel() {
319
+ return this._outlineLevel || 0;
320
+ }
321
+
322
+ set outlineLevel(value) {
323
+ this._outlineLevel = value;
324
+ }
325
+
326
+ get collapsed() {
327
+ return !!(
328
+ this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow
329
+ );
330
+ }
331
+
332
+ // =========================================================================
333
+ get model() {
334
+ const cells = [];
335
+ let min = 0;
336
+ let max = 0;
337
+ this._cells.forEach(cell => {
338
+ if (cell) {
339
+ const cellModel = cell.model;
340
+ if (cellModel) {
341
+ if (!min || min > cell.col) {
342
+ min = cell.col;
343
+ }
344
+ if (max < cell.col) {
345
+ max = cell.col;
346
+ }
347
+ cells.push(cellModel);
348
+ }
349
+ }
350
+ });
351
+
352
+ return this.height || cells.length
353
+ ? {
354
+ cells,
355
+ number: this.number,
356
+ min,
357
+ max,
358
+ height: this.height,
359
+ style: this.style,
360
+ hidden: this.hidden,
361
+ outlineLevel: this.outlineLevel,
362
+ collapsed: this.collapsed,
363
+ }
364
+ : null;
365
+ }
366
+
367
+ set model(value) {
368
+ if (value.number !== this._number) {
369
+ throw new Error('Invalid row number in model');
370
+ }
371
+ this._cells = [];
372
+ let previousAddress;
373
+ value.cells.forEach(cellModel => {
374
+ switch (cellModel.type) {
375
+ case Cell.Types.Merge:
376
+ // special case - don't add this types
377
+ break;
378
+ default: {
379
+ let address;
380
+ if (cellModel.address) {
381
+ address = colCache.decodeAddress(cellModel.address);
382
+ } else if (previousAddress) {
383
+ // This is a <c> element without an r attribute
384
+ // Assume that it's the cell for the next column
385
+ const {row} = previousAddress;
386
+ const col = previousAddress.col + 1;
387
+ address = {
388
+ row,
389
+ col,
390
+ address: colCache.encodeAddress(row, col),
391
+ $col$row: `$${colCache.n2l(col)}$${row}`,
392
+ };
393
+ }
394
+ previousAddress = address;
395
+ const cell = this.getCellEx(address);
396
+ cell.model = cellModel;
397
+ break;
398
+ }
399
+ }
400
+ });
401
+
402
+ if (value.height) {
403
+ this.height = value.height;
404
+ } else {
405
+ delete this.height;
406
+ }
407
+
408
+ this.hidden = value.hidden;
409
+ this.outlineLevel = value.outlineLevel || 0;
410
+
411
+ this.style = (value.style && JSON.parse(JSON.stringify(value.style))) || {};
412
+ }
413
+ }
414
+
415
+ module.exports = Row;