libformula可能是一个很好的起点.这是概念证明:
$excel 'TRIM(" abc 123 ")'
abc 123
excel就是这个简单的shell脚本:
#!/bin/sh
java -cp /usr/share/java/commons-logging.jar:libformula/demo:libbase/dist/libbase-6.1-SNAPSHOT.jar:libformula/dist/libformula-6.1-SNAPSHOT.jar:/home/cwarden/git/excel/src org.xerus.excel.Excel "$1"
和org.xerus.excel.Excel从argv获取一个字符串并将其作为公式计算:
package org.xerus.excel;
import org.pentaho.reporting.libraries.formula.EvaluationException;
import org.pentaho.reporting.libraries.formula.Formula;
import org.pentaho.reporting.libraries.formula.DefaultFormulaContext;
import org.pentaho.reporting.libraries.formula.parser.ParseException;
public class Excel {
public static void main(final String[] args) throws ParseException,EvaluationException {
final Formula f = new Formula(args[0]);
f.initialize(new DefaultFormulaContext());
final Object o = f.evaluate();
System.out.println(o);
}
}
libformula包含一个演示程序org.pentaho.reporting.libraries.formula.demo.PrintAllFunctions,它打印出所有支持的函数:
Category User-Defined
ARRAYCONCATENATE,ARRAYCONTAINS,ARRAYLEFT,ARRAYMID,CSVARRAY,CSVTEXT,NORMALIZEARRAY,NULL,PARSEDATE,SEQUENCEQUOTER
Category Information
CHOOSE,COUNT,COUNTA,COUNTBLANK,ERROR,HASCHANGED,INDEX,ISBLANK,ISERR,ISERROR,ISEVEN,ISLOGICAL,ISNA,ISNONTEXT,ISNUMBER,ISODD,ISREF,ISTEXT,LOOKUP,NA,VALUE
Category Rounding
INT
Category Mathematical
ABS,ACOS,ACOSH,ASIN,atan,atan2,AVERAGE,AVERAGEA,COS,EVEN,EXP,LN,LOG10,MAX,MAXA,MIN,MINA,MOD,N,ODD,PI,POWER,SIN,SQRT,SUM,SUMA,VAR
Category Text
ARRAYRIGHT,ASC,CHAR,CLEAN,CODE,CONCATENATE,EXACT,FIND,FIXED,LEFT,LEN,LOWER,MESSAGE,MID,PROPER,REPLACE,REPT,RIGHT,SEARCH,STRINGCOUNT,SUBSTITUTE,T,TEXT,TRIM,UNICHAR,UNICODE,UPPER,URLENCODE
Category Date/Time
DATE,DATEDIF,DATETIMEVALUE,DATEVALUE,DAY,DAYS,HOUR,MINUTE,MONTH,MONTHEND,NOW,PREVWEEKDAY,SECOND,TIME,TIMEVALUE,TODAY,WEEKDAY,YEAR,YESTERDAY
Category Logical
AND,FALSE,IF,IFNA,NOT,OR,TRUE,XOR
Category Database
BEGINSWITH,CONTAINS,ENDSWITH,EQUALS,IN,LIKE