@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.
120 lines (103 loc) • 3.7 kB
JavaScript
;
const _ = require("lodash");
const RELATIONSHIP_SCHEMA_PREFIX = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/";
/**
* A relationship collection.
* @ignore
*/
class Relationships {
/**
* Creates a new instance of _Relationships.
* @param {{}} node - The node.
*/
constructor(node) {
this._init(node);
this._getStartingId();
}
/**
* Add a new relationship.
* @param {string} type - The type of relationship.
* @param {string} target - The target of the relationship.
* @param {string} [targetMode] - The target mode of the relationship.
* @returns {{}} The new relationship.
*/
add(type, target, targetMode) {
const node = {
name: "Relationship",
attributes: {
Id: `rId${this._nextId++}`,
Type: `${RELATIONSHIP_SCHEMA_PREFIX}${type}`,
Target: target
}
};
if (targetMode) {
node.attributes.TargetMode = targetMode;
}
this._node.children.push(node);
return node;
}
/**
* Find a relationship by ID.
* @param {string} id - The relationship ID.
* @returns {{}|undefined} The matching relationship or undefined if not found.
*/
findById(id) {
return _.find(this._node.children, node => node.attributes.Id === id);
}
/**
* Find a relationship by type.
* @param {string} type - The type to search for.
* @returns {{}|undefined} The matching relationship or undefined if not found.
*/
findByType(type) {
return _.find(this._node.children, node => node.attributes.Type === `${RELATIONSHIP_SCHEMA_PREFIX}${type}`);
}
/**
* Convert the collection to an XML object.
* @returns {{}|undefined} The XML or undefined if empty.
*/
toXml() {
if (!this._node.children.length) return;
return this._node;
}
/**
* Get the starting relationship ID to use for new relationships.
* @private
* @returns {undefined}
*/
_getStartingId() {
this._nextId = 1;
this._node.children.forEach(node => {
const id = parseInt(node.attributes.Id.substr(3));
if (id >= this._nextId) this._nextId = id + 1;
});
}
/**
* Initialize the node.
* @param {{}} [node] - The relationships node.
* @private
* @returns {undefined}
*/
_init(node) {
if (!node) node = {
name: "Relationships",
attributes: {
xmlns: "http://schemas.openxmlformats.org/package/2006/relationships"
},
children: []
};
this._node = node;
}
}
module.exports = Relationships;
/*
xl/_rels/workbook.xml.rels
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>
<Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain" Target="calcChain.xml"/>
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings" Target="sharedStrings.xml"/>
</Relationships>
*/