private void processFormular(Dataset ds) { RowData rd = ds.getCurrentRowData(); if (rd == null) return; int rcount = rd.getRowCount(); List<String> executedFpList = new ArrayList<String>(); int fieldCount = ds.getFieldSet().getFieldCount(); for (int i = 0; i < fieldCount; i++) { try { Field field = ds.getFieldSet().getField(i); List<String> fieldFormulars = new ArrayList<String>(); String formular = field.getEditFormular(); if (formular != null) fieldFormulars.add(formular); formular = field.getLoadFormular(); if (formular != null) fieldFormulars.add(formular); Iterator<String> fit = fieldFormulars.iterator(); while (fit.hasNext()) { formular = fit.next(); String exp = null; if (formular != null) exp = JsURLDecoder.decode(formular, "UTF-8"); // 如果没有加载公式,继续下一个字段 if (exp == null) continue; if (executedFpList.contains(exp)) continue; executedFpList.add(exp); String[] expArr = exp.split(";"); fp.setExpressArray(expArr); VarryVO[] varryVOs = fp.getVarryArray(); if (varryVOs == null || varryVOs.length == 0) continue; String[] formularNames = new String[varryVOs.length]; Map<String, Integer> indexMap = getIndexMap(ds); for (int j = 0; j < varryVOs.length; j++) { String[] keys = varryVOs[j].getVarry(); if (keys != null) { for (String key : keys) { List<Object> valueList = new ArrayList<Object>(); for (int k = 0; k < rcount; k++) { Row r = rd.getRow(k); // Object value = r.getValue(indexMap.get(key)); Field f = ds.getFieldSet().getField(key); if (f != null && value != null) { // //如果是Double类型,进行一下转换 if (StringDataTypeConst.UFDOUBLE.equals(f.getDataType()) || StringDataTypeConst.DOUBLE.equals(f.getDataType()) || StringDataTypeConst.Decimal.equals(f.getDataType())) { if (!(value instanceof UFDouble)) value = new UFDouble(value.toString()); } else if (StringDataTypeConst.INTEGER.equals(f.getDataType())) { if (!(value instanceof Integer)) value = new Integer((String) value); } } valueList.add(value); } fp.addVariable(key, valueList); } formularNames[j] = varryVOs[j].getFormulaName(); } } Object[][] result = fp.getValueOArray(); if (result != null) { for (int l = 0; l < formularNames.length; l++) { int index = ds.nameToIndex(formularNames[l]); if (index == -1) { LfwLogger.error( "can not find column:" + formularNames[l] + ", ds id:" + ds.getId()); continue; } for (int k = 0; k < rcount; k++) { Row r = rd.getRow(k); r.setValue(index, result[l][k]); } } } } } catch (Throwable e) { Logger.error(e.getMessage(), e); } } }