亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在不使用 excel 的情況下在 java 中評估 excel/其他語言表達式評估的庫

在不使用 excel 的情況下在 java 中評估 excel/其他語言表達式評估的庫

胡說叔叔 2023-05-10 15:12:00
我一直在互聯網上搜索可以在 java 中評估類似 excel 公式的表達式的庫 該公式未嵌入 excel 中。比方說,這些值也不在 excel 中 比方說 3 個變量,,a我想要一個 java 中的求值器,它給定一個像用 excel 表達式或其他語言寫的字符串,可以給我輸出。bcCONCAT(a,b,c)我在網上找到了一些java的表達式計算器庫,但是我需要定義自己的表達式語言,有沒有直接使用excel語言或其他語言的東西?我查看了 apache POI,jxls也查看了jsp.el我所了解的poi,并jxls根據已經嵌入到 excel 文件中的公式進行了評估,或者我們需要創建一個電子表格來實際運行該公式,這imo將比在 java 中運行該公式更重。因為jsp.el我必須定義我自己的表達語言,它不夠健壯。
查看完整描述

2 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

apache poi需要工作簿是正確的WorkbookEvaluator。并且由于您正在談論評估“類似 excel 公式的表達式”,這是必要的,因為此類公式中的所有變量都必須是該工作簿中的單元格引用或名稱。您給出的示例CONCATENATE(a,b,c)只能Excela,bcExcelnames 時用作公式。否則會#Name?導致Excel.?順便說一句: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名稱不能是c或,因為這會與可能的單元格引用C發生沖突。R1C1這就是為什么我命名我的名字_a,_b和_c。


查看完整回答
反對 回復 2023-05-10
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

要使用 IF 函數,我必須創建一個 Cell 實例以防止出現 NullPointerException:


Cell cell = workbookWithVariables.getSheet(workbookWithVariables.getSheetName(0)).createRow(0).createCell(0);

CellReference reference = new CellReference(cell);


查看完整回答
反對 回復 2023-05-10
  • 2 回答
  • 0 關注
  • 282 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號