@@ -193,21 +193,129 @@ function write_XLSBFormulaRef3D(str, wb) {
193
193
var out = new_buf ( 17 ) ;
194
194
out . write_shift ( 4 , 9 ) ;
195
195
out . write_shift ( 1 , 0x1A | ( ( 1 ) << 5 ) ) ;
196
- out . write_shift ( 2 , 1 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
196
+ out . write_shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
197
197
out . write_shift ( 4 , cell . r ) ;
198
198
out . write_shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( / \$ \d / ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
199
199
out . write_shift ( 4 , 0 ) ;
200
200
201
201
return out ;
202
202
}
203
203
204
+ /* Writes a PtgRefErr3d */
205
+ function write_XLSBFormulaRefErr3D ( str , wb ) {
206
+ var lastbang = str . lastIndexOf ( "!" ) ;
207
+ var sname = str . slice ( 0 , lastbang ) ;
208
+ str = str . slice ( lastbang + 1 ) ;
209
+ if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( / ' ' / g, "'" ) ;
210
+
211
+ var out = new_buf ( 17 ) ;
212
+ out . write_shift ( 4 , 9 ) ;
213
+ out . write_shift ( 1 , 0x1C | ( ( 1 ) << 5 ) ) ;
214
+ out . write_shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
215
+ out . write_shift ( 4 , 0 ) ;
216
+ out . write_shift ( 2 , 0 ) ; // <== ColRelShort
217
+ out . write_shift ( 4 , 0 ) ;
218
+
219
+ return out ;
220
+ }
221
+
222
+ /* Writes a single sheet range [PtgRef PtgRef PtgRange] */
223
+ function write_XLSBFormulaRange ( _str ) {
224
+ var parts = _str . split ( ":" ) , str = parts [ 0 ] ;
225
+
226
+ var out = new_buf ( 23 ) ;
227
+ out . write_shift ( 4 , 15 ) ;
228
+
229
+ /* start cell */
230
+ str = parts [ 0 ] ; var cell = decode_cell ( str ) ;
231
+ out . write_shift ( 1 , 0x04 | ( ( 1 ) << 5 ) ) ;
232
+ out . write_shift ( 4 , cell . r ) ;
233
+ out . write_shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( / \$ \d / ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
234
+ out . write_shift ( 4 , 0 ) ;
235
+
236
+ /* end cell */
237
+ str = parts [ 1 ] ; cell = decode_cell ( str ) ;
238
+ out . write_shift ( 1 , 0x04 | ( ( 1 ) << 5 ) ) ;
239
+ out . write_shift ( 4 , cell . r ) ;
240
+ out . write_shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( / \$ \d / ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
241
+ out . write_shift ( 4 , 0 ) ;
242
+
243
+ /* PtgRange */
244
+ out . write_shift ( 1 , 0x11 ) ;
245
+
246
+ out . write_shift ( 4 , 0 ) ;
247
+
248
+ return out ;
249
+ }
250
+
251
+ /* Writes a range with explicit sheet name [PtgRef3D PtgRef3D PtgRange] */
252
+ function write_XLSBFormulaRangeWS ( _str , wb ) {
253
+ var lastbang = _str . lastIndexOf ( "!" ) ;
254
+ var sname = _str . slice ( 0 , lastbang ) ;
255
+ _str = _str . slice ( lastbang + 1 ) ;
256
+ if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( / ' ' / g, "'" ) ;
257
+ var parts = _str . split ( ":" ) ; str = parts [ 0 ] ;
258
+
259
+ var out = new_buf ( 27 ) ;
260
+ out . write_shift ( 4 , 19 ) ;
261
+
262
+ /* start cell */
263
+ var str = parts [ 0 ] , cell = decode_cell ( str ) ;
264
+ out . write_shift ( 1 , 0x1A | ( ( 1 ) << 5 ) ) ;
265
+ out . write_shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
266
+ out . write_shift ( 4 , cell . r ) ;
267
+ out . write_shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( / \$ \d / ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
268
+
269
+ /* end cell */
270
+ str = parts [ 1 ] ; cell = decode_cell ( str ) ;
271
+ out . write_shift ( 1 , 0x1A | ( ( 1 ) << 5 ) ) ;
272
+ out . write_shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
273
+ out . write_shift ( 4 , cell . r ) ;
274
+ out . write_shift ( 2 , cell . c | ( ( str . charAt ( 0 ) == "$" ? 0 : 1 ) << 14 ) | ( ( str . match ( / \$ \d / ) ? 0 : 1 ) << 15 ) ) ; // <== ColRelShort
275
+
276
+ /* PtgRange */
277
+ out . write_shift ( 1 , 0x11 ) ;
278
+
279
+ out . write_shift ( 4 , 0 ) ;
280
+
281
+ return out ;
282
+ }
283
+
284
+ /* Writes a range with explicit sheet name [PtgArea3d] */
285
+ function write_XLSBFormulaArea3D ( _str , wb ) {
286
+ var lastbang = _str . lastIndexOf ( "!" ) ;
287
+ var sname = _str . slice ( 0 , lastbang ) ;
288
+ _str = _str . slice ( lastbang + 1 ) ;
289
+ if ( sname . charAt ( 0 ) == "'" ) sname = sname . slice ( 1 , - 1 ) . replace ( / ' ' / g, "'" ) ;
290
+ var range = decode_range ( _str ) ;
291
+
292
+ var out = new_buf ( 23 ) ;
293
+ out . write_shift ( 4 , 15 ) ;
294
+
295
+ out . write_shift ( 1 , 0x1B | ( ( 1 ) << 5 ) ) ;
296
+ out . write_shift ( 2 , 2 + wb . SheetNames . map ( function ( n ) { return n . toLowerCase ( ) ; } ) . indexOf ( sname . toLowerCase ( ) ) ) ;
297
+ out . write_shift ( 4 , range . s . r ) ;
298
+ out . write_shift ( 4 , range . e . r ) ;
299
+ out . write_shift ( 2 , range . s . c ) ;
300
+ out . write_shift ( 2 , range . e . c ) ;
301
+
302
+ out . write_shift ( 4 , 0 ) ;
303
+
304
+ return out ;
305
+ }
306
+
307
+
204
308
/* General Formula */
205
309
function write_XLSBFormula ( val /*:string*/ , wb ) {
206
310
if ( / ^ # ( D I V \/ 0 ! | G E T T I N G _ D A T A | N \/ A | N A M E \? | N U L L ! | N U M ! | R E F ! | V A L U E ! ) $ / . test ( val ) ) return write_XLSBFormulaErr ( + RBErr [ val ] ) ;
207
311
if ( val . match ( / ^ \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) $ / ) ) return write_XLSBFormulaRef ( val ) ;
208
- if ( val . match ( / ^ (?: ' [ ^ \\ \/ ? * \[ \] : ] * ' | [ ^ ' ] [ ^ \\ \/ ? * \[ \] : ' ` ~ ! @ # $ % ^ ( ) \- _ = + { } | ; , < . > ] * ) ! \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) $ / ) ) return write_XLSBFormulaRef3D ( val , wb ) ;
209
- if ( val . match ( / ^ " .* " $ / ) ) return write_XLSBFormulaStr ( val ) ;
210
- if ( val . match ( / ^ \d + $ / ) ) return write_XLSBFormulaNum ( parseInt ( val , 10 ) ) ;
312
+ if ( val . match ( / ^ \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) : \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) $ / ) ) return write_XLSBFormulaRange ( val ) ;
313
+ if ( val . match ( / ^ # R E F ! \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) : \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) $ / ) ) return write_XLSBFormulaArea3D ( val , wb ) ;
314
+ if ( val . match ( / ^ (?: ' [ ^ \\ \/ ? * \[ \] : ] * ' | [ ^ ' ] [ ^ \\ \/ ? * \[ \] : ' ` ~ ! @ # $ % ^ ( ) \- = + { } | ; , < . > ] * ) ! \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) $ / ) ) return write_XLSBFormulaRef3D ( val , wb ) ;
315
+ if ( val . match ( / ^ (?: ' [ ^ \\ \/ ? * \[ \] : ] * ' | [ ^ ' ] [ ^ \\ \/ ? * \[ \] : ' ` ~ ! @ # $ % ^ ( ) \- = + { } | ; , < . > ] * ) ! \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) : \$ ? (?: [ A - W ] [ A - Z ] { 2 } | X [ A - E ] [ A - Z ] | X F [ A - D ] | [ A - Z ] { 1 , 2 } ) \$ ? (?: 1 0 [ 0 - 3 ] \d { 4 } | 1 0 4 [ 0 - 7 ] \d { 3 } | 1 0 4 8 [ 0 - 4 ] \d { 2 } | 1 0 4 8 5 [ 0 - 6 ] \d | 1 0 4 8 5 7 [ 0 - 6 ] | [ 1 - 9 ] \d { 0 , 5 } ) $ / ) ) return write_XLSBFormulaRangeWS ( val , wb ) ;
316
+ if ( / ^ (?: ' [ ^ \\ \/ ? * \[ \] : ] * ' | [ ^ ' ] [ ^ \\ \/ ? * \[ \] : ' ` ~ ! @ # $ % ^ ( ) \- = + { } | ; , < . > ] * ) ! # R E F ! $ / . test ( val ) ) return write_XLSBFormulaRefErr3D ( val , wb ) ;
317
+ if ( / ^ " .* " $ / . test ( val ) ) return write_XLSBFormulaStr ( val ) ;
318
+ if ( / ^ [ + - ] \d + $ / . test ( val ) ) return write_XLSBFormulaNum ( parseInt ( val , 10 ) ) ;
211
319
throw "Formula |" + val + "| not supported for XLSB" ;
212
320
}
213
321
var write_XLSBNameParsedFormula = write_XLSBFormula ;
0 commit comments