@@ -119,16 +119,32 @@ var HTML_ = (function() {
119
119
} ;
120
120
} ) ( ) ;
121
121
122
- function parse_dom_table ( table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
122
+ function sheet_add_dom ( ws /*:Worksheet*/ , table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
123
123
var opts = _opts || { } ;
124
124
if ( DENSE != null ) opts . dense = DENSE ;
125
- var ws /*:Worksheet*/ = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
125
+ var or_R = 0 , or_C = 0 ;
126
+ if ( opts . origin != null ) {
127
+ if ( typeof opts . origin == 'number' ) or_R = opts . origin ;
128
+ else {
129
+ var _origin /*:CellAddress*/ = typeof opts . origin == "string" ? decode_cell ( opts . origin ) : opts . origin ;
130
+ or_R = _origin . r ; or_C = _origin . c ;
131
+ }
132
+ }
126
133
var rows /*:HTMLCollection<HTMLTableRowElement>*/ = table . getElementsByTagName ( 'tr' ) ;
127
- var sheetRows = opts . sheetRows || 10000000 ;
128
- var range /*:Range*/ = { s :{ r :0 , c :0 } , e :{ r :0 , c :0 } } ;
134
+ var sheetRows = Math . min ( opts . sheetRows || 10000000 , rows . length ) ;
135
+ var range /*:Range*/ = { s :{ r :0 , c :0 } , e :{ r :or_R , c :or_C } } ;
136
+ if ( ws [ "!ref" ] ) {
137
+ var _range /*:Range*/ = decode_range ( ws [ "!ref" ] ) ;
138
+ range . s . r = Math . min ( range . s . r , _range . s . r ) ;
139
+ range . s . c = Math . min ( range . s . c , _range . s . c ) ;
140
+ range . e . r = Math . max ( range . e . r , _range . e . r ) ;
141
+ range . e . c = Math . max ( range . e . c , _range . e . c ) ;
142
+ if ( or_R == - 1 ) range . e . r = or_R = _range . e . r + 1 ;
143
+ }
129
144
var merges /*:Array<Range>*/ = [ ] , midx = 0 ;
130
- var rowinfo /*:Array<RowInfo>*/ = [ ] ;
145
+ var rowinfo /*:Array<RowInfo>*/ = ws [ "!rows" ] || ( ws [ "!rows" ] = [ ] ) ;
131
146
var _R = 0 , R = 0 , _C = 0 , C = 0 , RS = 0 , CS = 0 ;
147
+ if ( ! ws [ "!cols" ] ) ws [ '!cols' ] = [ ] ;
132
148
for ( ; _R < rows . length && R < sheetRows ; ++ _R ) {
133
149
var row /*:HTMLTableRowElement*/ = rows [ _R ] ;
134
150
if ( is_dom_element_hidden ( row ) ) {
@@ -143,11 +159,11 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
143
159
var z /*:?string*/ = elt . getAttribute ( 'z' ) ;
144
160
for ( midx = 0 ; midx < merges . length ; ++ midx ) {
145
161
var m /*:Range*/ = merges [ midx ] ;
146
- if ( m . s . c == C && m . s . r <= R && R <= m . e . r ) { C = m . e . c + 1 ; midx = - 1 ; }
162
+ if ( m . s . c == C + or_C && m . s . r < R + or_R && R + or_R <= m . e . r ) { C = m . e . c + 1 - or_C ; midx = - 1 ; }
147
163
}
148
164
/* TODO: figure out how to extract nonstandard mso- style */
149
165
CS = + elt . getAttribute ( "colspan" ) || 1 ;
150
- if ( ( RS = + elt . getAttribute ( "rowspan" ) ) > 0 || CS > 1 ) merges . push ( { s :{ r :R , c :C } , e :{ r :R + ( RS || 1 ) - 1 , c :C + CS - 1 } } ) ;
166
+ if ( ( ( RS = ( + elt . getAttribute ( "rowspan" ) || 1 ) ) ) > 1 || CS > 1 ) merges . push ( { s :{ r :R + or_R , c :C + or_C } , e :{ r :R + or_R + ( RS || 1 ) - 1 , c :C + or_C + ( CS || 1 ) - 1 } } ) ;
151
167
var o /*:Cell*/ = { t :'s' , v :v } ;
152
168
var _t /*:string*/ = elt . getAttribute ( "t" ) || "" ;
153
169
if ( v != null ) {
@@ -163,21 +179,26 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
163
179
}
164
180
}
165
181
if ( o . z === undefined && z != null ) o . z = z ;
166
- if ( opts . dense ) { if ( ! ws [ R ] ) ws [ R ] = [ ] ; ws [ R ] [ C ] = o ; }
167
- else ws [ encode_cell ( { c :C , r :R } ) ] = o ;
168
- if ( range . e . c < C ) range . e . c = C ;
182
+ if ( opts . dense ) { if ( ! ws [ R + or_R ] ) ws [ R + or_R ] = [ ] ; ws [ R + or_R ] [ C + or_C ] = o ; }
183
+ else ws [ encode_cell ( { c :C + or_C , r :R + or_R } ) ] = o ;
184
+ if ( range . e . c < C + or_C ) range . e . c = C + or_C ;
169
185
C += CS ;
170
186
}
171
187
++ R ;
172
188
}
173
- if ( merges . length ) ws [ '!merges' ] = merges ;
174
- if ( rowinfo . length ) ws [ '!rows' ] = rowinfo ;
175
- range . e . r = R - 1 ;
189
+ if ( merges . length ) ws [ '!merges' ] = ( ws [ "!merges" ] || [ ] ) . concat ( merges ) ;
190
+ range . e . r = Math . max ( range . e . r , R - 1 + or_R ) ;
176
191
ws [ '!ref' ] = encode_range ( range ) ;
177
- if ( R >= sheetRows ) ws [ '!fullref' ] = encode_range ( ( range . e . r = rows . length - _R + R - 1 , range ) ) ; // We can count the real number of rows to parse but we don't to improve the performance
192
+ if ( R >= sheetRows ) ws [ '!fullref' ] = encode_range ( ( range . e . r = rows . length - _R + R - 1 + or_R , range ) ) ; // We can count the real number of rows to parse but we don't to improve the performance
178
193
return ws ;
179
194
}
180
195
196
+ function parse_dom_table ( table /*:HTMLElement*/ , _opts /*:?any*/ ) /*:Worksheet*/ {
197
+ var opts = _opts || { } ;
198
+ var ws /*:Worksheet*/ = opts . dense ? ( [ ] /*:any*/ ) : ( { } /*:any*/ ) ;
199
+ return sheet_add_dom ( ws , table , _opts ) ;
200
+ }
201
+
181
202
function table_to_book ( table /*:HTMLElement*/ , opts /*:?any*/ ) /*:Workbook*/ {
182
203
return sheet_to_workbook ( parse_dom_table ( table , opts ) , opts ) ;
183
204
}
0 commit comments