forked from sheetjs/sheetjs
version bump 0.2.7-b: formatted string support
Mixed formatting stored in the shared string table. Ultimately there will be a function to convert to HTML, but in the interim this extracts plaintext and populates the right fields
This commit is contained in:
parent
8c8d855bb6
commit
55ba84d561
@ -119,8 +119,8 @@ function parsexmltag(tag) {
|
||||
|
||||
function parsexmlbool(value, tag) {
|
||||
switch(value) {
|
||||
case '0': case 0: case 'false': case 'FALSE': return false;
|
||||
case '1': case 1: case 'true': case 'TRUE': return true;
|
||||
case '0': case 0: case 'false': case 'FALSE': return false;
|
||||
case '1': case 1: case 'true': case 'TRUE': return true;
|
||||
default: throw "bad boolean value " + value + " in "+(tag||"?");
|
||||
}
|
||||
}
|
||||
@ -140,7 +140,7 @@ function parseSheet(data) {
|
||||
|
||||
var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };
|
||||
var q = ["v","f"];
|
||||
|
||||
var sidx = 0;
|
||||
/* 18.3.1.80 sheetData CT_SheetData ? */
|
||||
if(!data.match(/<sheetData *\/>/))
|
||||
data.match(/<sheetData>([^\u2603]*)<\/sheetData>/m)[1].split("</row>").forEach(function(x) {
|
||||
@ -167,7 +167,11 @@ function parseSheet(data) {
|
||||
else p.t = (cell.t ? cell.t : "n"); // default is "n" in schema
|
||||
switch(p.t) {
|
||||
case 'n': p.v = parseFloat(p.v); break;
|
||||
case 's': p.v = strs[parseInt(p.v, 10)].t; break;
|
||||
case 's': {
|
||||
sidx = parseInt(p.v, 10);
|
||||
p.v = strs[sidx].t;
|
||||
p.r = strs[sidx].r;
|
||||
} break;
|
||||
case 'str': if(p.v) p.v = utf8read(p.v); break; // normal string
|
||||
case 'inlineStr':
|
||||
p.t = 'str'; p.v = unescapexml(d.match(matchtag('t'))[1]);
|
||||
@ -237,13 +241,33 @@ var utf8read = function(orig) {
|
||||
return out;
|
||||
};
|
||||
|
||||
/* 18.4.8 si CT_Rst */
|
||||
function parse_si(x) {
|
||||
var z = {};
|
||||
if(!x) return z;
|
||||
var y;
|
||||
/* 18.4.12 t ST_Xstring plaintext string */
|
||||
if((y = x.match(/^<t[^>]*>([^\u2603]*)<\/t>$/m))) {
|
||||
z.t = utf8read(unescapexml(y[1]));
|
||||
z.r = x;
|
||||
}
|
||||
/* 18.4.4 r CT_RElt Rich Text Run */
|
||||
else if((y = x.match(/<r>/))) {
|
||||
z.r = x;
|
||||
/* TODO: properly parse (note: no other valid child can have body text) */
|
||||
z.t = utf8read(unescapexml(x.replace(/<[^>]*>/gm,"")));
|
||||
}
|
||||
/* TODO: handle rPh and phoneticPr */
|
||||
return z;
|
||||
}
|
||||
|
||||
/* 18.4 Shared String Table */
|
||||
function parseStrs(data) {
|
||||
var s = [];
|
||||
/* 18.4.9 sst CT_Sst */
|
||||
var sst = data.match(new RegExp("<sst ([^>]*)>([\\s\\S]*)<\/sst>","m"));
|
||||
if(sst) {
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(function(x) { var z = {};
|
||||
var y=x.match(/<(.*)>([\s\S]*)<\/.*/); if(y) z[y[1].split(" ")[0]]=utf8read(unescapexml(y[2])); return z;});
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si);
|
||||
|
||||
sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ function sheet_to_csv(sheet) {
|
||||
var stringify = function stringify(val) {
|
||||
switch(val.t){
|
||||
case 'n': return String(val.v);
|
||||
case 's': case 'str':
|
||||
case 's': case 'str':
|
||||
if(typeof val.v === 'undefined') return "";
|
||||
return JSON.stringify(val.v);
|
||||
case 'b': return val.v ? "TRUE" : "FALSE";
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.2.7",
|
||||
"version": "0.2.7-b",
|
||||
"author": "Niggler",
|
||||
"description": "(one day) a full-featured XLSX parser and writer. For now, primitive parser",
|
||||
"keywords": [
|
||||
|
38
xlsx.js
38
xlsx.js
@ -343,8 +343,8 @@ function parsexmltag(tag) {
|
||||
|
||||
function parsexmlbool(value, tag) {
|
||||
switch(value) {
|
||||
case '0': case 0: case 'false': case 'FALSE': return false;
|
||||
case '1': case 1: case 'true': case 'TRUE': return true;
|
||||
case '0': case 0: case 'false': case 'FALSE': return false;
|
||||
case '1': case 1: case 'true': case 'TRUE': return true;
|
||||
default: throw "bad boolean value " + value + " in "+(tag||"?");
|
||||
}
|
||||
}
|
||||
@ -364,7 +364,7 @@ function parseSheet(data) {
|
||||
|
||||
var refguess = {s: {r:1000000, c:1000000}, e: {r:0, c:0} };
|
||||
var q = ["v","f"];
|
||||
|
||||
var sidx = 0;
|
||||
/* 18.3.1.80 sheetData CT_SheetData ? */
|
||||
if(!data.match(/<sheetData *\/>/))
|
||||
data.match(/<sheetData>([^\u2603]*)<\/sheetData>/m)[1].split("</row>").forEach(function(x) {
|
||||
@ -391,7 +391,11 @@ function parseSheet(data) {
|
||||
else p.t = (cell.t ? cell.t : "n"); // default is "n" in schema
|
||||
switch(p.t) {
|
||||
case 'n': p.v = parseFloat(p.v); break;
|
||||
case 's': p.v = strs[parseInt(p.v, 10)].t; break;
|
||||
case 's': {
|
||||
sidx = parseInt(p.v, 10);
|
||||
p.v = strs[sidx].t;
|
||||
p.r = strs[sidx].r;
|
||||
} break;
|
||||
case 'str': if(p.v) p.v = utf8read(p.v); break; // normal string
|
||||
case 'inlineStr':
|
||||
p.t = 'str'; p.v = unescapexml(d.match(matchtag('t'))[1]);
|
||||
@ -461,13 +465,33 @@ var utf8read = function(orig) {
|
||||
return out;
|
||||
};
|
||||
|
||||
/* 18.4.8 si CT_Rst */
|
||||
function parse_si(x) {
|
||||
var z = {};
|
||||
if(!x) return z;
|
||||
var y;
|
||||
/* 18.4.12 t ST_Xstring plaintext string */
|
||||
if((y = x.match(/^<t[^>]*>([^\u2603]*)<\/t>$/m))) {
|
||||
z.t = utf8read(unescapexml(y[1]));
|
||||
z.r = x;
|
||||
}
|
||||
/* 18.4.4 r CT_RElt Rich Text Run */
|
||||
else if((y = x.match(/<r>/))) {
|
||||
z.r = x;
|
||||
/* TODO: properly parse (note: no other valid child can have body text) */
|
||||
z.t = utf8read(unescapexml(x.replace(/<[^>]*>/gm,"")));
|
||||
}
|
||||
/* TODO: handle rPh and phoneticPr */
|
||||
return z;
|
||||
}
|
||||
|
||||
/* 18.4 Shared String Table */
|
||||
function parseStrs(data) {
|
||||
var s = [];
|
||||
/* 18.4.9 sst CT_Sst */
|
||||
var sst = data.match(new RegExp("<sst ([^>]*)>([\\s\\S]*)<\/sst>","m"));
|
||||
if(sst) {
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(function(x) { var z = {};
|
||||
var y=x.match(/<(.*)>([\s\S]*)<\/.*/); if(y) z[y[1].split(" ")[0]]=utf8read(unescapexml(y[2])); return z;});
|
||||
s = sst[2].replace(/<si>/g,"").split(/<\/si>/).map(parse_si);
|
||||
|
||||
sst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;
|
||||
}
|
||||
@ -893,7 +917,7 @@ function sheet_to_csv(sheet) {
|
||||
var stringify = function stringify(val) {
|
||||
switch(val.t){
|
||||
case 'n': return String(val.v);
|
||||
case 's': case 'str':
|
||||
case 's': case 'str':
|
||||
if(typeof val.v === 'undefined') return "";
|
||||
return JSON.stringify(val.v);
|
||||
case 'b': return val.v ? "TRUE" : "FALSE";
|
||||
|
Loading…
Reference in New Issue
Block a user