exceljs
Version:
Excel Workbook Manager - Read and Write xlsx and csv Files.
314 lines (297 loc) • 13.4 kB
JavaScript
/**
* Copyright (c) 2016 Guyon Roche
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
'use strict';
var _ = require('underscore');
var utils = require('../../../utils/utils');
var BaseXform = require('../base-xform');
// for dev reference
// var DataValidationTemplate = { // a _ denotes defaults
// address: 'A1',
// type: ['list', 'whole', 'decimal', 'date', 'textLength'],
// operator: ['between', 'notBetween', 'equal', 'notEqual', 'greaterThan', 'lessThan', 'greaterThanOrEqual', 'lessThanOrEqual'],
// allowBlank: [true, false],
// showInputMessage: [true, false],
// showErrorMessage: [true, false],
// formulae: [['DefinedName', '<value>', '"list,of,values"', '$A$1', '$A$1:$B$2','ACTUAL("Formula")']],
// promptTitle: ['Title'],
// prompt: ['words'],
// errorStyle: ['error', 'warning', 'information'],
// errorTitle: ['Title'],
// error: ['words']
// };
function assign(definedName, attributes, name, defaultValue) {
var value = attributes[name];
if (value !== undefined) {
definedName[name] = value;
} else if (defaultValue !== undefined) {
definedName[name] = defaultValue;
}
}
function assignBool(definedName, attributes, name, defaultValue) {
var value = attributes[name];
if (value !== undefined) {
definedName[name] = (value === '1');
} else if (defaultValue !== undefined) {
definedName[name] = defaultValue;
}
}
var DataValidationsXform = module.exports = function() {
};
utils.inherits(DataValidationsXform, BaseXform, {
get tag() { return 'dataValidations'; },
render: function(xmlStream, model) {
var count = model && Object.keys(model).length;
if (count) {
xmlStream.openNode('dataValidations', {count: count});
_.each(model, function (value, address) {
xmlStream.openNode('dataValidation');
xmlStream.addAttribute('type', value.type);
if (value.operator && (value.type !== 'list') && (value.operator !== 'between')) {
xmlStream.addAttribute('operator', value.operator);
}
if (value.allowBlank) {
xmlStream.addAttribute('allowBlank', '1');
}
if (value.showInputMessage) {
xmlStream.addAttribute('showInputMessage', '1');
}
if (value.promptTitle) {
xmlStream.addAttribute('promptTitle', value.promptTitle);
}
if (value.prompt) {
xmlStream.addAttribute('prompt', value.prompt);
}
if (value.showErrorMessage) {
xmlStream.addAttribute('showErrorMessage', '1');
}
if (value.errorStyle) {
xmlStream.addAttribute('errorStyle', value.errorStyle);
}
if (value.errorTitle) {
xmlStream.addAttribute('errorTitle', value.errorTitle);
}
if (value.error) {
xmlStream.addAttribute('error', value.error);
}
xmlStream.addAttribute('sqref', address);
_.each(value.formulae, function (formula, index) {
xmlStream.openNode('formula' + (index + 1));
if (value.type === 'date') {
xmlStream.writeText(utils.dateToExcel(formula));
} else {
xmlStream.writeText(formula);
}
xmlStream.closeNode();
});
xmlStream.closeNode();
});
xmlStream.closeNode();
}
},
parseOpen: function(node) {
switch(node.name) {
case 'dataValidations':
this.model = {};
return true;
case 'dataValidation':
this._address = node.attributes.sqref;
var definedName = this._definedName = {
type: node.attributes.type,
formulae: []
};
assignBool(definedName, node.attributes, 'allowBlank');
assignBool(definedName, node.attributes, 'showInputMessage');
assignBool(definedName, node.attributes, 'showErrorMessage');
switch (definedName.type) {
case 'list':
case 'custom':
break;
default:
assign(definedName, node.attributes, 'operator', 'between');
break;
}
assign(definedName, node.attributes, 'promptTitle');
assign(definedName, node.attributes, 'prompt');
assign(definedName, node.attributes, 'errorStyle');
assign(definedName, node.attributes, 'errorTitle');
assign(definedName, node.attributes, 'error');
return true;
case 'formula1':
case 'formula2':
this._formula = [];
return true;
default:
return false;
}
},
parseText: function(text) {
this._formula.push(text);
},
parseClose: function(name) {
switch(name) {
case 'dataValidations':
return false;
case 'dataValidation':
this.model[this._address] = this._definedName;
return true;
case 'formula1':
case 'formula2':
var formula = this._formula.join('');
switch (this._definedName.type) {
case 'whole':
case 'textLength':
formula = parseInt(formula);
break;
case 'decimal':
formula = parseFloat(formula);
break;
case 'date':
formula = utils.excelToDate(parseFloat(formula));
break;
default:
break;
}
this._definedName.formulae.push(formula);
return true;
default:
return true;
}
}
});
// <dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="B1">
// <formula0>Nephews</formula0>
// </dataValidation>
// <dataValidations count="34">
// <dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="E1">
// <formula1>Ducks</formula1>
// </dataValidation>
// <dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C1">
// <formula1>Ducks</formula1>
// </dataValidation>
// <dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C5 E5">
// <formula1>"Tom, Dick, Harry"</formula1>
// </dataValidation>
// <dataValidation type="list" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C7">
// <formula1>$A$7:$A$9</formula1>
// </dataValidation>
// <dataValidation type="whole" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C11">
// <formula1>5</formula1>
// <formula2>10</formula2>
// </dataValidation>
// <dataValidation type="whole" operator="notBetween" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="E11">
// <formula1>3</formula1>
// <formula2>7</formula2>
// </dataValidation>
// <dataValidation type="whole" operator="equal" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="G11">
// <formula1>7</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="notEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="I11">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="greaterThan" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="K11">
// <formula1>3</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="lessThan" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="M11">
// <formula1>6</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="greaterThanOrEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="O11">
// <formula1>10</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="lessThanOrEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="Q11">
// <formula1>11</formula1>
// </dataValidation>
// <dataValidation type="decimal" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C13">
// <formula1>5.5</formula1>
// <formula2>6.6</formula2>
// </dataValidation>
// <dataValidation type="decimal" operator="notBetween" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="E13">
// <formula1>2.2</formula1>
// <formula2>5.5</formula2>
// </dataValidation>
// <dataValidation type="decimal" operator="equal" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="G13">
// <formula1>3.1415926</formula1>
// </dataValidation>
// <dataValidation type="decimal" operator="notEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="I13">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="decimal" operator="greaterThan" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="K13">
// <formula1>4</formula1>
// </dataValidation>
// <dataValidation type="decimal" operator="lessThan" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="M13">
// <formula1>77</formula1>
// </dataValidation>
// <dataValidation type="decimal" operator="greaterThanOrEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="O13">
// <formula1>4</formula1>
// </dataValidation>
// <dataValidation type="decimal" operator="lessThanOrEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="Q13">
// <formula1>4</formula1>
// </dataValidation>
// <dataValidation type="whole" showInputMessage="1" showErrorMessage="1" sqref="S11">
// <formula1>5</formula1>
// <formula2>7</formula2>
// </dataValidation>
// <dataValidation type="decimal" showInputMessage="1" showErrorMessage="1" sqref="S13">
// <formula1>1</formula1>
// <formula2>6</formula2>
// </dataValidation>
// <dataValidation type="date" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C15">
// <formula1>42370</formula1>
// <formula2>42400</formula2>
// </dataValidation>
// <dataValidation type="textLength" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C19">
// <formula1>5</formula1>
// <formula2>10</formula2>
// </dataValidation>
// <dataValidation type="textLength" operator="notBetween" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="E19">
// <formula1>5</formula1>
// <formula2>10</formula2>
// </dataValidation>
// <dataValidation type="custom" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C21">
// <formula1>OR(C21=5,C21=7)</formula1>
// </dataValidation>
// <dataValidation type="whole" allowBlank="1" showInputMessage="1" showErrorMessage="1" promptTitle="This is Title" prompt="This is Input Message" sqref="C23">
// <formula1>3</formula1>
// <formula2>8</formula2>
// </dataValidation>
// <dataValidation type="whole" operator="equal" allowBlank="1" showErrorMessage="1" sqref="C25">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="equal" allowBlank="1" showInputMessage="1" showErrorMessage="1" errorTitle="Error Title" error="Error Message" sqref="C27">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" errorStyle="warning" operator="equal" allowBlank="1" showInputMessage="1" showErrorMessage="1" errorTitle="Warning Title" error="Warning Message" sqref="E27">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" errorStyle="information" operator="equal" allowBlank="1" showInputMessage="1" showErrorMessage="1" errorTitle="Info Title" error="Info Message" sqref="G27">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="equal" allowBlank="1" showInputMessage="1" errorTitle="Don't Show Title" error="Don't Show Message" sqref="I27">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="equal" allowBlank="1" showErrorMessage="1" promptTitle="Don't Show Title" prompt="Don't Show Message" sqref="E23">
// <formula1>5</formula1>
// </dataValidation>
// <dataValidation type="whole" operator="notEqual" allowBlank="1" showInputMessage="1" showErrorMessage="1" sqref="C31">
// <formula1>odds</formula1>
// </dataValidation>
// </dataValidations>