FormulaUtils.java 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.ims.common.utils;
  2. import org.apache.poi.hssf.usermodel.*;
  3. import org.apache.poi.ss.formula.FormulaParseException;
  4. import org.apache.poi.ss.usermodel.CellType;
  5. import org.apache.poi.ss.usermodel.FormulaEvaluator;
  6. import java.math.BigDecimal;
  7. public class FormulaUtils {
  8. /**
  9. * Sheet 中的每一行
  10. */
  11. private static HSSFRow row = null;
  12. private static FormulaEvaluator formulaEvaluator = null;
  13. /**
  14. * 计算值
  15. *
  16. * @param formula Excel 中的公式,例如:MAX(56-FLOOR(20/6,1),2)
  17. * @return
  18. */
  19. public static double caculateFormula(String formula) {
  20. if(formula.startsWith("=")){
  21. formula =formula.replace("=","");
  22. }
  23. HSSFWorkbook workbook = new HSSFWorkbook();
  24. HSSFSheet sheet = workbook.createSheet();
  25. row = sheet.createRow(0);
  26. formulaEvaluator = new HSSFFormulaEvaluator(workbook);
  27. // 这里必须新建一个对象,否则只有第一个 formula 才有效。查看 formulaEvaluator.evaluate 的源码。
  28. HSSFCell cell = row.createCell(0);
  29. cell.setCellType(CellType.FORMULA);
  30. try {
  31. cell.setCellFormula(formula);
  32. double value = formulaEvaluator.evaluate(cell).getNumberValue();
  33. return new BigDecimal(value).setScale(4, BigDecimal.ROUND_CEILING).doubleValue();
  34. } catch (FormulaParseException e) {
  35. System.out.print(e.getMessage());
  36. return 0;
  37. }
  38. }
  39. }