XLFormula Engine

XLFormula Engine is a Rust crate for parsing and evaluating Excel formulas. It currently works with f32 types.

Features

It supports:

Installation

Add the corresponding entry to your Cargo.toml dependency list: toml [dependencies] xlformula_engine = "0.1.4" and add this to your crate root: rust extern crate xlformula_engine;

Examples

Here are simple examples of parsing an Excel formula string and evaluating to a result: ```rust extern crate xlformulaengine; use xlformulaengine::calculate; use xlformulaengine::parseformula; use xlformula_engine::NoFormula;

fn main() { let formula = parseformula::parsestringtoformula(&"=1+2"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=(1(2+3))2"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=1+3/0"); // error (#DIV/0!) let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result)); } ``` The last string is evaluated to #DIV/0!.

Concatenating strings: ```rust extern crate xlformulaengine; use xlformulaengine::calculate; use xlformulaengine::parseformula; use xlformula_engine::NoFormula;

fn main() { let formula = parseformula::parsestringtoformula(&"=\"Hello \" & \" World!\""); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=1 + \"Hello\""); // error (#CAST!) let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result)); } ``` Concatenating number and string results in a #CAST! error.

Constants ( i.e. a string without '=' ): ```rust extern crate xlformulaengine; use xlformulaengine::calculate; use xlformulaengine::parseformula; use xlformula_engine::NoFormula;

fn main() { let formula = parseformula::parsestringtoformula(&"1.2"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"Hello World"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result)); } ```

Excel functions: ```rust extern crate xlformulaengine; use xlformulaengine::calculate; use xlformulaengine::parseformula; use xlformula_engine::NoFormula;

fn main() { let formula = parseformula::parsestringtoformula(&"=ABS(-1)"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=SUM(1,2,\"3\")"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=PRODUCT(ABS(1),21, 3,41)"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result)); } ```

Logical expressions: ```rust extern crate xlformulaengine; use xlformulaengine::calculate; use xlformulaengine::parseformula; use xlformula_engine::NoFormula;

fn main() { let formula = parseformula::parsestringtoformula(&"=2>=1"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=OR(1>1,1<>1)"); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result));

let formula = parseformula::parsestringtoformula(&"=AND(\"test\",\"True\", 1, true) "); let result = calculate::calculateformula(formula, None::); println!("Result is {}", calculate::resultto_string(result)); } ```

References: ```rust extern crate xlformulaengine; use xlformulaengine::calculate; use xlformulaengine::parseformula; use xlformula_engine::types;

fn main() { let datafunction = |s: String| match s.asstr() { "A" => types::Value::Text("=1+B".tostring()), "B" => types::Value::Number(3.0), _ => types::Value::Error(types::Error::Value), }; let formula = parseformula::parsestringtoformula(&"=A+B"); let result = calculate::calculateformula(formula, Some(&datafunction)); println!("Result is {}", calculate::resultto_string(result)); } ```

License

Licensed under MIT License (see the LICENSE file for the full text).

Contact

Please feel free to contact us at jirada.herbst@data2impact.com.