Hi everyone!
I'm a new user for this mail group so let me know if I'm making any mistakes
here!
So I'm having some issues getting user defined functions running. I've defined
a STDEV.P and T.TEST custom functions and attached them using:
private static void setupCustomFormulas(Workbook wb){
String[] functionNames = { "STDEV.P", "T.TEST" } ;
FreeRefFunction[] functionImpls = { new STDEVP(), new TTEST() } ;
UDFFinder udfs = new DefaultUDFFinder( functionNames, functionImpls ) ;
UDFFinder udfToolpack = new AggregatingUDFFinder( udfs ) ;
wb.addToolPack(udfToolpack);
}
Here's the evaluate method of the STDEV.P class:
class STDEVP implements FreeRefFunction {
@Override
public ValueEval evaluate(ValueEval[] arg0, OperationEvaluationContext
arg1)
{
// Pull out values in the range provided
String firstPoint = arg0[0].toString().replace("]",
"").split("!")[1].split(":")[0];
String secondPoint = arg0[0].toString().replace("]",
"").split("!")[1].split(":")[1];
String sheetName = arg0[0].toString().split("\\[")[1].split("!")[0];
EvaluationWorkbook wb = arg1.getWorkbook();
EvaluationSheet sheet = wb.getSheet(wb.getSheetIndex(sheetName));
double value = 0;
char curCol = firstPoint.charAt(0);
char curRow = firstPoint.charAt(1);
char finalCol = secondPoint.charAt(0);
ArrayList<Double> values = new ArrayList<Double>();
while(curCol < finalCol){
value = getNumericCellValue(sheet, Character.toString(curCol) +
Character.toString(curRow));
values.add(value);
curCol++;
}
// Calculate standard deviation for data set and return
return new NumberEval(getStdDev(values));
}
Here's the TTEST evaluate method:
class TTEST implements FreeRefFunction{
@Override
public ValueEval evaluate(ValueEval[] arg0, OperationEvaluationContext arg1)
{
for(int i = 0; i < arg0.length; i++){
System.out.println("ARGS: " + arg0[i]);
}
String start1 = arg0[0].toString().replace("]",
"").split("!")[1].split(":")[0];
String end1 = arg0[0].toString().replace("]",
"").split("!")[1].split(":")[1];
String start2 = arg0[1].toString().replace("]",
"").split("!")[1].split(":")[0];
String end2 = arg0[1].toString().replace("]",
"").split("!")[1].split(":")[1];
String sheetName = arg0[0].toString().split("\\[")[1].split("!")[0];
EvaluationSheet sheet =
arg1.getWorkbook().getSheet(arg1.getWorkbook().getSheetIndex(sheetName));
double[] set1 = getValuesInRange(start1, end1, sheet);
double[] set2 = getValuesInRange(start2, end2, sheet);
TTest ttest = new TTest();
double t_statistic = ttest.t(set1, set2);
return new NumberEval(t_statistic);
}
How I write the formula cells:
for(int i = 0; i < grid.length; i++){
Row row = sheet.createRow((short)i);
for (int j = 0; j < grid[i].length; j++){
Cell cell = row.createCell(j);
try{
cell.setCellValue((Double)grid[i][j]);
}
catch(Exception e){
String val = (String) grid[i][j];
if (val != null && val.startsWith("=")){
val = val.replaceAll("=", "");
cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula(val);
}
else{
cell.setCellValue(val);
}
}
}
}
So when I run my code and hit the evaluateAll() method no exceptions are thrown
but when I open the workbook generated the default formulas are correctly
calculated but the UDF formulas report back "#NAME?" as the value. When I click
on the cell the contained formula is correct, though. Any ideas what I'm doing
wrong here?
Thanks a lot!
Justin