gpt4 book ai didi

java - 在java中不使用excel来评估excel/其他语言表达式评估的库

转载 作者:行者123 更新时间:2023-12-02 09:38:20 25 4
gpt4 key购买 nike

我一直在互联网上搜索一个可以在java中评估类似于Excel公式的表达式的库该公式未嵌入Excel中。

比方说,这些值也不在 excel 中比方说 3 个变量 abc 我想要一个 Java 中的求值器,其中给定一个用 Excel 表达式或其他语言编写的字符串,例如 CONCAT(a,b,c) ,可以给我输出。

我在网上找到了一些java的表达式评估器库,但是我需要定义自己的表达式语言,有没有直接使用excel语言或其他语言的东西?

据我了解 poi,我已经查看了 apache POIjxls 也查看了 jsp.el code> 和 jxls 根据已嵌入 Excel 文件中的公式进行计算,或者我们需要创建一个电子表格来实际运行该公式,而 imo 会比运行公式更繁重在Java中。对于 jsp.el 我必须定义自己的表达式语言,但它不够健壮。

最佳答案

apache poiWorkbookEvaluator 需要工作簿是正确的。由于您正在讨论评估“Excel 类似公式的表达式”,因此这是必要的,因为此类公式中的所有变量都必须是该工作簿中的单元格引用或名称。您给定的示例 CONCATENATE(a,b,c) 只能在 ab 时用作 Excel 公式和 cExcel 名称。否则会导致 Excel 中出现 #Name? 错误。顺便说一句:Excel 函数是 CONCATENATE 而不是 CONCAT

但是这个工作簿不一定存储在某个地方。它也只能存在于随机存取存储器中。

并且公式本身不需要位于工作表中的某个位置。该公式也可以作为字符串给出,因为有 WorkbookEvaluator.evaluate(java.lang.String formula, CellReference ref) .

示例:

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Name;

import org.apache.poi.ss.formula.BaseFormulaEvaluator;
import org.apache.poi.ss.formula.WorkbookEvaluator;

import org.apache.poi.ss.formula.eval.*;

import org.apache.poi.ss.util.CellReference;

public class EvaluateExcelFunctions {

static Object evaluateExcelFormula(String formula, Workbook workbookWithVariables) {
if (workbookWithVariables.getNumberOfSheets() < 1) workbookWithVariables.createSheet();
CellReference reference = new CellReference(workbookWithVariables.getSheetName(0), 0 , 0, false, false);
CreationHelper helper = workbookWithVariables.getCreationHelper();
FormulaEvaluator formulaevaluator = helper.createFormulaEvaluator();
WorkbookEvaluator workbookevaluator = ((BaseFormulaEvaluator)formulaevaluator)._getWorkbookEvaluator();
ValueEval valueeval = null;
try {
valueeval = workbookevaluator.evaluate(formula, reference);
} catch (Exception ex) {
return ex.toString();
}
if (valueeval instanceof StringValueEval) {
String result = ((StringValueEval)valueeval).getStringValue();
return result;
} else if (valueeval instanceof NumericValueEval) {
double result = ((NumericValueEval)valueeval).getNumberValue();
return result;
} else if (valueeval instanceof ErrorEval) {
String result = ((ErrorEval)valueeval).getErrorString();
return result;
}
return null;
}

public static void main(String[] args) throws Exception {

Workbook workbook =
//new XSSFWorkbook();
new HSSFWorkbook();

Name name;
String formula;
Object result;

// example 1 concatenating strings - your example
name = workbook.createName();
name.setNameName("_a");
name.setRefersToFormula("\"Text A \"");
name = workbook.createName();
name.setNameName("_b");
name.setRefersToFormula("\"Text B \"");
name = workbook.createName();
name.setNameName("_c");
name.setRefersToFormula("\"Text C \"");

formula = "CONCATENATE(_a, _b, _c)";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

// example 2 Pythagorean theorem
name = workbook.getName("_a");
name.setRefersToFormula("12.34");
name = workbook.getName("_b");
name.setRefersToFormula("56.78");

formula = "SQRT(_a^2 + _b^2)";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

// example 3 complex math formula
name = workbook.getName("_a");
name.setRefersToFormula("12.34");
name = workbook.getName("_b");
name.setRefersToFormula("56.78");
name = workbook.getName("_c");
name.setRefersToFormula("90.12");

formula = "((_a+_b+_c)*_c/_b-_a)/2";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

// example 4 faulty formulas
name = workbook.getName("_a");
name.setRefersToFormula("56.78");
name = workbook.getName("_b");
name.setRefersToFormula("190.12");
name = workbook.getName("_c");
name.setRefersToFormula("\"text\"");

formula = "_a + _c";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

formula = "((_a + _b";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

formula = "_a \\ 2";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

formula = "_a^_b";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

formula = "_a/(_b-_b)";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

formula = "CONCAT(_a, _b)";
result = evaluateExcelFormula(formula, workbook);
System.out.println(result);

workbook.close();
}
}

此代码使用 apache poi 4.1.0 进行测试。

注意,Excel 名称不能是所有可能的变量名称。例如,Excel 名称不能是 cC,因为这可能与可能的 R1C1 单元格引用发生冲突。这就是为什么我将自己的名字命名为 _a_b_c

关于java - 在java中不使用excel来评估excel/其他语言表达式评估的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57324522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com