Fix/issue148/unsupportedvaluetype #316

Closed
ziacik wants to merge 3 commits from fix/issue148/unsupportedvaluetype into master

63
ods.js
View File

@ -214,8 +214,25 @@ var parse_content_xml = (function() {
var ctag;
var textp, textpidx, textptag;
var R, C, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
var columnRepeatCount;
var number_format_map = {};
var merges = [], mrange = {}, mR = 0, mC = 0;
var simpleCloneOf = function _simpleCloneOf(obj) {
if (obj == null || typeof(obj) != 'object') {
return obj;
}
var temp = obj.constructor();
for (var key in obj) {
if(obj.hasOwnProperty(key)) {
temp[key] = simpleCloneOf(obj[key]);
}
}
return temp;
}
while((Rn = xlmlregex.exec(str))) switch(Rn[3]) {
@ -238,20 +255,35 @@ var parse_content_xml = (function() {
if(Rn[1] === '/') break;
++R; C = -1; break;
case 'covered-table-cell': // 9.1.5 table:covered-table-cell
++C; break; /* stub */
ctag = parsexmltag(Rn[0]);
if(ctag['number-columns-repeated']) {
C+= parseInt(ctag['number-columns-repeated'], 10);
} else {
++C;
}
break; /* stub */
case 'table-cell':
if(Rn[0].charAt(Rn[0].length-2) === '/') {
ctag = parsexmltag(Rn[0]);
if(ctag['number-columns-repeated']) C+= parseInt(ctag['number-columns-repeated'], 10);
else ++C;
}
else if(Rn[1]!=='/') {
++C;
else if(Rn[1]!=='/') {
ctag = parsexmltag(Rn[0]);
if(ctag['number-columns-repeated'])
columnRepeatCount = parseInt(ctag['number-columns-repeated'], 10);
else
columnRepeatCount = 1;
var firstC = C + 1;
C += columnRepeatCount;
if(firstC < range.s.c) range.s.c = firstC;
if(R < range.s.r) range.s.r = R;
if(C > range.e.c) range.e.c = C;
if(R > range.e.r) range.e.r = R;
if(C < range.s.c) range.s.c = C;
if(R < range.s.r) range.s.r = R;
ctag = parsexmltag(Rn[0]);
q = {t:ctag['value-type'], v:null};
if(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {
mR = parseInt(ctag['number-rows-spanned'],10) || 0;
@ -268,13 +300,24 @@ var parse_content_xml = (function() {
case 'date': q.t = 'n'; q.v = datenum(ctag['date-value']); q.z = 'm/d/yy'; break;
case 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400; break;
case 'string': q.t = 's'; break;
default: throw new Error('Unsupported value type ' + q.t);
case undefined: q = null; break;
default : throw new Error('Unsupported value type ' + q.t);
}
} else {
if(q.t === 's') q.v = textp;
if(textp) q.w = textp;
if(!(opts.sheetRows && opts.sheetRows < R)) ws[get_utils().encode_cell({r:R,c:C})] = q;
if (q) {
if(q.t === 's') q.v = textp;
if(textp) q.w = textp;
if(!(opts.sheetRows && opts.sheetRows < R)) {
for (var i = 0; i < columnRepeatCount; i++) {
if (i > 0) {
q = simpleCloneOf(q);
}
ws[get_utils().encode_cell({r:R,c:C - columnRepeatCount + i + 1})] = q;
}
}
}
q = null;
textp = null;
}
break; // 9.1.4 <table:table-cell>