@amanoooo/office-chart
Version:
create office xlsx and pptx with tables and charts
236 lines (235 loc) • 12.4 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ChartTool = void 0;
class ChartTool {
constructor(xmlTool) {
this.xmlTool = xmlTool;
this.addChart = (sheet, sheetName, opt, id) => __awaiter(this, void 0, void 0, function* () {
let readChart = yield this.xmlTool.readXml(`xl/charts/chart${this.getChartNum(opt)}.xml`);
this.buildChart(readChart, opt, sheetName);
if (sheet) {
yield this.addDrawingRel(id);
yield this.addChartToDraw(id);
yield this.addChartToSheetRel(id);
yield this.addChartToParts(id);
yield this.addChartToSheet(sheet, id);
return this.xmlTool.write(`xl/charts/chart${id}.xml`, readChart);
}
return readChart;
});
this.getChartNum = (opt) => {
switch (opt.type) {
case 'bar':
return 1;
case 'line':
return 2;
case 'pie':
return 3;
case 'scatter':
return 4;
}
};
this.buildChart = (readChart, opt, sheetName) => {
var _a, _b, _c, _d;
sheetName = `'${sheetName}'`;
readChart['c:chartSpace']['c:chart']['c:title']['c:tx']['c:rich']['a:p']['a:r']['a:t'] = opt.title.name;
if (opt.title.color) {
readChart['c:chartSpace']['c:chart']['c:title']['c:tx']['c:rich']['a:p']['a:r']['a:rPr']['a:solidFill']['a:srgbClr'].$.val = opt.title.color;
}
if (opt.title.size) {
readChart['c:chartSpace']['c:chart']['c:title']['c:tx']['c:rich']['a:p']['a:r']['a:rPr'].$.sz = opt.title.size;
}
const chartType = `c:${opt.type}Chart`;
let rowNum = '';
let firstRow = 1;
let lastCol = '';
let firstCol = '';
try {
const splitRange = opt.range.split(':');
Array.from(splitRange[0]).forEach(letter => {
const notNumCheck = isNaN(parseInt(letter));
if (notNumCheck) {
firstCol += letter;
}
else {
firstRow = parseInt(letter);
}
});
Array.from(splitRange[1]).forEach(letter => {
const letterNum = parseInt(letter);
if (isNaN(letterNum)) {
lastCol += letter;
}
else {
rowNum += letter;
}
});
}
catch (_e) {
console.log('range is not right');
throw Error('range is not right');
}
const ser = Object.assign({}, readChart['c:chartSpace']['c:chart']['c:plotArea'][chartType]['c:ser']);
readChart['c:chartSpace']['c:chart']['c:plotArea'][chartType]['c:ser'] = [];
// delete readChart['c:chartSpace']['c:chart']['c:plotArea']['c:layout']
//deleta extra 'dd' in line template
if ((_b = (_a = readChart['c:chartSpace']['c:chart']['c:plotArea']['c:catAx']) === null || _a === void 0 ? void 0 : _a['c:title']) === null || _b === void 0 ? void 0 : _b['c:tx']['c:rich']['a:p']['a:r']['a:t']) {
readChart['c:chartSpace']['c:chart']['c:plotArea']['c:catAx']['c:title']['c:tx']['c:rich']['a:p']['a:r']['a:t'] = '';
}
for (let i = firstRow; i < parseInt(rowNum); i++) {
const data = JSON.parse(JSON.stringify(ser));
let d = data[0] || data;
d['c:idx'] = { $: { val: i - 1 } };
d['c:order'] = { $: { val: i - 1 } };
if (opt.type !== 'scatter') {
// default use 1 row for x axis
d['c:cat']['c:strRef']['c:f'] = sheetName + `!$${firstCol}$${firstRow}:$${lastCol}$${firstRow} `;
d['c:val']['c:numRef']['c:f'] = sheetName + `!$${firstCol}$${(i + 1)}:$${lastCol}$${(i + 1)}`;
if (opt.hasOwnProperty('data')) {
d['c:cat']['c:strRef']['c:strCache'] = this.buildCache(opt['data'][0], opt.labels);
d['c:val']['c:numRef']['c:numCache'] = this.buildCache(opt['data'][i], opt.labels);
}
}
else {
d['c:xVal']['c:numRef']['c:f'] = sheetName + `!$${firstCol}$1:$${lastCol}$1`;
d['c:yVal']['c:numRef']['c:f'] = sheetName + `!$${firstCol}$${(i + 1)}:$${lastCol}$${(i + 1)}`;
}
if (opt.rgbColors && opt.rgbColors[i - 1] && (opt.type === 'line' || opt.type === 'bar')) {
d['c:spPr']['a:ln']['a:solidFill']['a:srgbClr'].$.val = opt.rgbColors[i - 1];
if (d['c:spPr']['a:solidFill']) {
d['c:spPr']['a:solidFill'] = {
'a:srgbClr': {
$: {
val: opt.rgbColors[i - 1]
}
}
};
}
}
if (opt.type === 'line') {
d['c:spPr']['a:ln'].$.w = opt.lineWidth || 30000;
}
if (d['c:marker'] && (opt === null || opt === void 0 ? void 0 : opt.marker) && (opt.type === 'line')) {
d['c:marker']['c:size'].$.val = ((_c = opt === null || opt === void 0 ? void 0 : opt.marker) === null || _c === void 0 ? void 0 : _c.size) || '4';
d['c:marker']['c:symbol'].$.val = ((_d = opt === null || opt === void 0 ? void 0 : opt.marker) === null || _d === void 0 ? void 0 : _d.shape) || 'circle';
delete d['c:marker']['c:spPr']['a:noFill'];
if (opt.rgbColors && opt.rgbColors[i - 1]) {
d['c:marker']['c:spPr']['a:solidFill'] = { 'a:srgbClr': { $: { val: opt.rgbColors[i - 1] } } };
d['c:marker']['c:spPr']['a:ln']['a:solidFill']['a:srgbClr'].$.val = opt.rgbColors[i - 1];
}
}
if (opt.labels) {
d['c:tx'] = {
'c:strRef': {
'c:f': sheetName + `!$${String.fromCharCode(firstCol.charCodeAt(0) - 1)}$${i + 1}`
}
};
if (opt.hasOwnProperty('data')) {
d['c:tx']['c:strRef']['c:strCache'] = {
'c:ptCount': { $: { val: 1 } },
'c:pt': {
$: { idx: 0 },
'c:v': opt['data'][i][0]
}
};
}
}
else {
delete d['c:tx'];
}
readChart['c:chartSpace']['c:chart']['c:plotArea'][chartType]['c:ser'].push(d);
if (!!readChart['c:chartSpace']['c:chart']['c:plotArea']['c:valAx'] && opt.type !== 'scatter') {
readChart['c:chartSpace']['c:chart']['c:plotArea']['c:valAx']['c:majorUnit'] = {};
readChart['c:chartSpace']['c:chart']['c:plotArea']['c:valAx']['c:minorUnit'] = {};
if (readChart['c:chartSpace']['c:chart']['c:legend']['c:layout']) {
delete readChart['c:chartSpace']['c:chart']['c:legend']['c:layout'];
// readChart['c:chartSpace']['c:chart']['c:legend']['c:layout']['c:manualLayout']['c:h'] = {
// $: { val: 0.08 * rowNum + 1 }
// }
}
}
}
return readChart;
};
this.buildCache = (rowData, labels) => {
const rowDataCopy = JSON.parse(JSON.stringify(rowData));
if (labels) {
rowDataCopy.shift();
}
const cache = { 'c:ptCount': { $: { val: `${rowDataCopy.length}` } } };
cache['c:pt'] = [];
for (let i = 0; i < rowDataCopy.length; i++) {
cache['c:pt'].push({
$: { idx: `${i}` },
'c:v': rowDataCopy[i]
});
}
return cache;
};
this.addDrawingRel = (id) => __awaiter(this, void 0, void 0, function* () {
const drawRel = yield this.xmlTool.readXml('xl/drawings/_rels/drawing2.xml.rels'); //add new chart rel
drawRel.Relationships.Relationship =
{
'$': {
Id: 'rId' + id,
Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart",
Target: `../charts/chart${id}.xml`
}
};
yield this.xmlTool.write(`xl/drawings/_rels/drawing${id}.xml.rels`, drawRel);
return id;
});
this.addChartToDraw = (id) => __awaiter(this, void 0, void 0, function* () {
const draw = yield this.xmlTool.readXml('xl/drawings/drawing2.xml'); // add new chart draw
draw['xdr:wsDr']['xdr:oneCellAnchor']['xdr:graphicFrame']['a:graphic']['a:graphicData']['c:chart'].$['r:id'] = 'rId' + id;
return this.xmlTool.write(`xl/drawings/drawing${id}.xml`, draw);
});
this.addChartToSheetRel = (id) => __awaiter(this, void 0, void 0, function* () {
const draw = yield this.xmlTool.readXml('xl/worksheets/_rels/sheet2.xml.rels'); // add new chart to sheet rel
draw['Relationships']['Relationship'] =
{
'$': {
Id: 'rId' + id,
Type: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing',
Target: `../drawings/drawing${id}.xml`
}
};
return this.xmlTool.write(`xl/worksheets/_rels/sheet${id}.xml.rels`, draw);
});
this.addChartToSheet = (sheet, id) => __awaiter(this, void 0, void 0, function* () {
sheet['worksheet']['drawing'] = {
$: {
'r:id': "rId" + id
}
};
return this.xmlTool.write(`xl/worksheets/sheet${id}.xml`, sheet);
});
this.addChartToParts = (id) => __awaiter(this, void 0, void 0, function* () {
const parts = this.parts || (yield this.xmlTool.readXml('[Content_Types].xml'));
parts['Types']['Override'].push({
'$': {
ContentType: 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml',
PartName: `/xl/charts/chart${id}.xml`
}
});
parts['Types']['Override'].push({
'$': {
ContentType: 'application/vnd.openxmlformats-officedocument.drawing+xml',
PartName: `/xl/drawings/drawing${id}.xml`
}
});
this.parts = parts;
return this.xmlTool.write(`[Content_Types].xml`, parts);
});
}
}
exports.ChartTool = ChartTool;