@elbstack/xlsx-populate
Version:
Excel XLSX parser/generator written in JavaScript with Node.js and browser support, jQuery/d3-style method chaining, and a focus on keeping existing workbook features and styles in tact.
152 lines (135 loc) • 3.57 kB
JavaScript
"use strict";
const _ = require("lodash");
/**
* The shared strings table.
* @ignore
*/
class SharedStrings {
/**
* Constructs a new instance of _SharedStrings.
* @param {{}} node - The node.
*/
constructor(node) {
this._stringArray = [];
this._indexMap = {};
this._init(node);
this._cacheExistingSharedStrings();
}
/**
* Gets the index for a string
* @param {string|Array.<{}>} string - The string or rich text array.
* @returns {number} The index
*/
getIndexForString(string) {
// If the string is found in the cache, return the index.
const key = _.isArray(string) ? JSON.stringify(string) : string;
let index = this._indexMap[key];
if (index >= 0) return index;
// Otherwise, add it to the caches.
index = this._stringArray.length;
this._stringArray.push(string);
this._indexMap[key] = index;
// Append a new si node.
this._node.children.push({
name: "si",
children: _.isArray(string) ? string : [
{
name: "t",
attributes: { 'xml:space': "preserve" },
children: [string]
}
]
});
return index;
}
/**
* Get the string for a given index
* @param {number} index - The index
* @returns {string} The string
*/
getStringByIndex(index) {
return this._stringArray[index];
}
/**
* Convert the collection to an XML object.
* @returns {{}} The XML object.
*/
toXml() {
return this._node;
}
/**
* Store any existing values in the caches.
* @private
* @returns {undefined}
*/
_cacheExistingSharedStrings() {
this._node.children.forEach((node, i) => {
const content = node.children[0];
if (content.name === "t") {
const string = content.children[0];
this._stringArray.push(string);
this._indexMap[string] = i;
} else {
// TODO: Properly support rich text nodes in the future. For now just store the object as a placeholder.
this._stringArray.push(node.children);
this._indexMap[JSON.stringify(node.children)] = i;
}
});
}
/**
* Initialize the node.
* @param {{}} [node] - The shared strings node.
* @private
* @returns {undefined}
*/
_init(node) {
if (!node) node = {
name: "sst",
attributes: {
xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main"
},
children: []
};
this._node = node;
delete this._node.attributes.count;
delete this._node.attributes.uniqueCount;
}
}
module.exports = SharedStrings;
/*
xl/sharedStrings.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="13" uniqueCount="4">
<si>
<t>Foo</t>
</si>
<si>
<t>Bar</t>
</si>
<si>
<t>Goo</t>
</si>
<si>
<r>
<t>s</t>
</r><r>
<rPr>
<b/>
<sz val="11"/>
<color theme="1"/>
<rFont val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</rPr><t>d;</t>
</r><r>
<rPr>
<sz val="11"/>
<color theme="1"/>
<rFont val="Calibri"/>
<family val="2"/>
<scheme val="minor"/>
</rPr><t>lfk;l</t>
</r>
</si>
</sst>
*/