node package manager

xlsx-calc

 _  _  __    ____  _  _     ___   __   __     ___ 
( \/ )(  )  / ___)( \/ )   / __) / _\ (  )   / __)
 )  ( / (_/\\___ \ )  (   ( (__ /    \/ (_/\( (__ 
(_/\_)\____/(____/(_/\_)   \___)\_/\_/\____/ \___)

alt text

Installation

With npm:

npm install xlsx-calc

How to use

Read the workbook with the great js-xlsx lib.

var XLSX = require('xlsx');
var workbook = XLSX.readFile('test.xlsx');
 
// change some cell value 
workbook.Sheets['Sheet1'].A1.v = 42;
 
// recalc the workbook 
var XLSX_CALC = require('xlsx-calc');
XLSX_CALC(workbook);

formulajs integration

npm install --save formulajs

var XLSX_CALC = require('xlsx-calc');
 
// load your calc functions lib 
var formulajs = require('formulajs');
 
// import your calc functions lib 
XLSX_CALC.import_functions(formulajs);
 
var workbook = {Sheets: {Sheet1: {}}};
 
// use it 
workbook.Sheets.Sheet1.A5 = {f: 'BETA.DIST(2, 8, 10, true, 1, 3)'};
XLSX_CALC(workbook);
 
// see the result -> 0.6854705810117458 
console.log(workbook.Sheets.Sheet1.A5.v);

How to contribute

Read the basic-tests.js.

Run the mocha

$ mocha -w

write some test like:

//(...) 
describe('HELLO', function() {
    it('says: Hello, World!', function() {
        workbook.Sheets['Sheet1'].A1.f = 'HELLO("World")';
        XLSX_CALC(workbook);
        assert.equal(workbook.Sheets['Sheet1'].A1.v, "Hello, World!");
    });
});
//(...) 

Register your formula/function in the xlsx_Fx variable found inside xlsx-calc.js below the commentary "FORMULAS REGISTERED"

  // +---------------------+ 
  // | FORMULAS REGISTERED | 
  // +---------------------+ 
  var xlsx_Fx = {
    'FLOOR': Math.floor,
    'COUNTA': counta,
    'IRR': irr,
    'HELLO': hello // <---- Your contribution!! 
  };

Write the implementation function below the commentary "THE IMPLEMENTATIONS".

// +---------------------+ 
// | THE IMPLEMENTATIONS | 
// +---------------------+ 
function hello(name) {
  return name;
}

If everything is OK you will see the mocha out:

  1) XLSX_CALC HELLO says: Hello, World!:
 
      AssertionError: "World" == "Hello, World!"
      + expected - actual
 
      -World
      +Hello, World!
      
      at Context.<anonymous> (test/basic-test.js:510:20)

So end with the correct implementation:

// +---------------------+ 
// | THE IMPLEMENTATIONS | 
// +---------------------+ 
function hello(name) {
  return "Hello, " + name + "!";
}

Now in terminal:

  HELLO
    ✓ says: Hello, World!
 
  79 passing (75ms)

Give me the balloon watermelon!

Create a pull request

Thx!