forked from sheetjs/sheetjs
SheetJS
d15b81e0e9
- very basic XLSX / XLSM write support with roundtrip tests (XLSB stubs) - reorganized source tree - new XLSB range check ensures that A1 is not emitted for empty sheets - SSF table emitted in output (consistent with js-xls) - CLI supports writing Backwards-incompatible changes: o new Property aliases (see CORE_PROPS and EXT_PROPS) o FILETIME custom properties parsed as JS Dates o `xlsx2csv` -> `xlsx` (and `bin/xlsx{2csv,}.njs`)
146 lines
5.3 KiB
JavaScript
146 lines
5.3 KiB
JavaScript
/* 18.2 Workbook */
|
|
function parse_wb_xml(data) {
|
|
var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
|
|
var pass = false, xmlns = "xmlns";
|
|
data.match(/<[^>]*>/g).forEach(function(x) {
|
|
var y = parsexmltag(x);
|
|
switch(y[0].replace(/<\w+:/,"<")) {
|
|
case '<?xml': break;
|
|
|
|
/* 18.2.27 workbook CT_Workbook 1 */
|
|
case '<workbook':
|
|
if(x.match(/<\w+:workbook/)) xmlns = "xmlns" + x.match(/<(\w+):/)[1];
|
|
wb.xmlns = y[xmlns];
|
|
break;
|
|
case '</workbook>': break;
|
|
|
|
/* 18.2.13 fileVersion CT_FileVersion ? */
|
|
case '<fileVersion': delete y[0]; wb.AppVersion = y; break;
|
|
case '<fileVersion/>': break;
|
|
|
|
/* 18.2.12 fileSharing CT_FileSharing ? */
|
|
case '<fileSharing': case '<fileSharing/>': break;
|
|
|
|
/* 18.2.28 workbookPr CT_WorkbookPr ? */
|
|
case '<workbookPr': delete y[0]; wb.WBProps = y; break;
|
|
case '<workbookPr/>': delete y[0]; wb.WBProps = y; break;
|
|
|
|
/* 18.2.29 workbookProtection CT_WorkbookProtection ? */
|
|
case '<workbookProtection/>': break;
|
|
|
|
/* 18.2.1 bookViews CT_BookViews ? */
|
|
case '<bookViews>': case '</bookViews>': break;
|
|
/* 18.2.30 workbookView CT_BookView + */
|
|
case '<workbookView': delete y[0]; wb.WBView.push(y); break;
|
|
|
|
/* 18.2.20 sheets CT_Sheets 1 */
|
|
case '<sheets>': case '</sheets>': break; // aggregate sheet
|
|
/* 18.2.19 sheet CT_Sheet + */
|
|
case '<sheet': delete y[0]; y.name = utf8read(y.name); wb.Sheets.push(y); break;
|
|
|
|
/* 18.2.15 functionGroups CT_FunctionGroups ? */
|
|
case '<functionGroups': case '<functionGroups/>': break;
|
|
/* 18.2.14 functionGroup CT_FunctionGroup + */
|
|
case '<functionGroup': break;
|
|
|
|
/* 18.2.9 externalReferences CT_ExternalReferences ? */
|
|
case '<externalReferences': case '</externalReferences>': break;
|
|
/* 18.2.8 externalReference CT_ExternalReference + */
|
|
case '<externalReference': break;
|
|
|
|
/* 18.2.6 definedNames CT_DefinedNames ? */
|
|
case '<definedNames/>': break;
|
|
case '<definedNames>': pass=true; break;
|
|
case '</definedNames>': pass=false; break;
|
|
/* 18.2.5 definedName CT_DefinedName + */
|
|
case '<definedName': case '<definedName/>': case '</definedName>': break;
|
|
|
|
/* 18.2.2 calcPr CT_CalcPr ? */
|
|
case '<calcPr': delete y[0]; wb.CalcPr = y; break;
|
|
case '<calcPr/>': delete y[0]; wb.CalcPr = y; break;
|
|
|
|
/* 18.2.16 oleSize CT_OleSize ? (ref required) */
|
|
case '<oleSize': break;
|
|
|
|
/* 18.2.4 customWorkbookViews CT_CustomWorkbookViews ? */
|
|
case '<customWorkbookViews>': case '</customWorkbookViews>': case '<customWorkbookViews': break;
|
|
/* 18.2.3 customWorkbookView CT_CustomWorkbookView + */
|
|
case '<customWorkbookView': case '</customWorkbookView>': break;
|
|
|
|
/* 18.2.18 pivotCaches CT_PivotCaches ? */
|
|
case '<pivotCaches>': case '</pivotCaches>': case '<pivotCaches': break;
|
|
/* 18.2.17 pivotCache CT_PivotCache ? */
|
|
case '<pivotCache': break;
|
|
|
|
/* 18.2.21 smartTagPr CT_SmartTagPr ? */
|
|
case '<smartTagPr': case '<smartTagPr/>': break;
|
|
|
|
/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */
|
|
case '<smartTagTypes': case '<smartTagTypes>': case '</smartTagTypes>': break;
|
|
/* 18.2.22 smartTagType CT_SmartTagType ? */
|
|
case '<smartTagType': break;
|
|
|
|
/* 18.2.24 webPublishing CT_WebPublishing ? */
|
|
case '<webPublishing': case '<webPublishing/>': break;
|
|
|
|
/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */
|
|
case '<fileRecoveryPr': case '<fileRecoveryPr/>': break;
|
|
|
|
/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */
|
|
case '<webPublishObjects>': case '<webPublishObjects': case '</webPublishObjects>': break;
|
|
/* 18.2.25 webPublishObject CT_WebPublishObject ? */
|
|
case '<webPublishObject': break;
|
|
|
|
/* 18.2.10 extLst CT_ExtensionList ? */
|
|
case '<extLst>': case '</extLst>': case '<extLst/>': break;
|
|
/* 18.2.7 ext CT_Extension + */
|
|
case '<ext': pass=true; break; //TODO: check with versions of excel
|
|
case '</ext>': pass=false; break;
|
|
|
|
/* Others */
|
|
case '<mx:ArchID': break;
|
|
case '<mc:AlternateContent': pass=true; break;
|
|
case '</mc:AlternateContent>': pass=false; break;
|
|
}
|
|
});
|
|
if(XMLNS.main.indexOf(wb.xmlns) === -1) throw new Error("Unknown Namespace: " + wb.xmlns);
|
|
|
|
var z;
|
|
/* defaults */
|
|
for(z in WBPropsDef) if(typeof wb.WBProps[z] === 'undefined') wb.WBProps[z] = WBPropsDef[z];
|
|
for(z in CalcPrDef) if(typeof wb.CalcPr[z] === 'undefined') wb.CalcPr[z] = CalcPrDef[z];
|
|
|
|
wb.WBView.forEach(function(w){for(var z in WBViewDef) if(typeof w[z] === 'undefined') w[z]=WBViewDef[z]; });
|
|
wb.Sheets.forEach(function(w){for(var z in SheetDef) if(typeof w[z] === 'undefined') w[z]=SheetDef[z]; });
|
|
|
|
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
|
|
|
|
return wb;
|
|
}
|
|
|
|
var WB_XML_ROOT = writextag('workbook', null, {
|
|
'xmlns': XMLNS.main[0],
|
|
//'xmlns:mx': XMLNS.mx,
|
|
//'xmlns:s': XMLNS.main[0],
|
|
'xmlns:r': XMLNS.r
|
|
});
|
|
|
|
var write_wb_xml = function(wb, opts) {
|
|
var o = [];
|
|
o.push(XML_HEADER);
|
|
o.push(WB_XML_ROOT);
|
|
/* TODO: put this somewhere else */
|
|
var date1904 = "false";
|
|
try { date1904 = parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false"; } catch(e) { date1904 = "false"; }
|
|
o.push(writextag('workbookPr', null, {date1904:date1904}));
|
|
o.push("<sheets>");
|
|
var i = 1;
|
|
wb.SheetNames.forEach(function(s) {
|
|
o.push(writextag('sheet',null,{name:s, sheetId:String(i), "r:id":"rId"+i}));
|
|
++i;
|
|
});
|
|
o.push("</sheets>");
|
|
if(o.length>2){ o.push('</workbook>'); o[1]=o[1].replace("/>",">"); }
|
|
return o.join("");
|
|
};
|