exceljs
Version:
Excel Workbook Manager - Read and Write xlsx and csv Files.
118 lines (95 loc) • 2.79 kB
JavaScript
/* eslint-disable max-classes-per-file */
const utils = require('../../utils/utils');
const RelType = require('../../xlsx/rel-type');
class HyperlinksProxy {
constructor(sheetRelsWriter) {
this.writer = sheetRelsWriter;
}
push(hyperlink) {
this.writer.addHyperlink(hyperlink);
}
}
class SheetRelsWriter {
constructor(options) {
// in a workbook, each sheet will have a number
this.id = options.id;
// count of all relationships
this.count = 0;
// keep record of all hyperlinks
this._hyperlinks = [];
this._workbook = options.workbook;
}
get stream() {
if (!this._stream) {
// eslint-disable-next-line no-underscore-dangle
this._stream = this._workbook._openStream(`/xl/worksheets/_rels/sheet${this.id}.xml.rels`);
}
return this._stream;
}
get length() {
return this._hyperlinks.length;
}
each(fn) {
return this._hyperlinks.forEach(fn);
}
get hyperlinksProxy() {
return this._hyperlinksProxy || (this._hyperlinksProxy = new HyperlinksProxy(this));
}
addHyperlink(hyperlink) {
// Write to stream
const relationship = {
Target: hyperlink.target,
Type: RelType.Hyperlink,
TargetMode: 'External',
};
const rId = this._writeRelationship(relationship);
// store sheet stuff for later
this._hyperlinks.push({
rId,
address: hyperlink.address,
});
}
addMedia(media) {
return this._writeRelationship(media);
}
addRelationship(rel) {
return this._writeRelationship(rel);
}
commit() {
if (this.count) {
// write xml utro
this._writeClose();
// and close stream
this.stream.end();
}
}
// ================================================================================
_writeOpen() {
this.stream.write(
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">`
);
}
_writeRelationship(relationship) {
if (!this.count) {
this._writeOpen();
}
const rId = `rId${++this.count}`;
if (relationship.TargetMode) {
this.stream.write(
`<Relationship Id="${rId}"` +
` Type="${relationship.Type}"` +
` Target="${utils.xmlEncode(relationship.Target)}"` +
` TargetMode="${relationship.TargetMode}"` +
'/>'
);
} else {
this.stream.write(`<Relationship Id="${rId}" Type="${relationship.Type}" Target="${relationship.Target}"/>`);
}
return rId;
}
_writeClose() {
this.stream.write('</Relationships>');
}
}
module.exports = SheetRelsWriter;