package com.fr.function; import com.fr.base.ResultFormula; import com.fr.io.TemplateWorkBookIO; import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.main.impl.WorkBook; import com.fr.main.workbook.ResultWorkBook; import com.fr.report.cell.CellElement; import com.fr.report.report.ResultReport; import com.fr.script.AbstractFunction; import com.fr.stable.WriteActor; import com.fr.write.cal.WB; import java.util.HashMap; import java.util.Map; public class ReportCheck extends AbstractFunction { private static final Map wMap = new HashMap<>(); public Object run(Object[] args) { // 获取公式中的参数 String cptname = args[0].toString(); // 获取报表名称 int colnumber = Integer.parseInt(args[2].toString()); // 所取单元格所在列 int rownumber = Integer.parseInt(args[3].toString()); // 所取单元格所在行 // 定义返回的值 Object returnValue = null; try { ResultWorkBook rworkbook = null; // 读取模板 WorkBook workbook = (WorkBook)TemplateWorkBookIO .readTemplateWorkBook(cptname); // 获取需要传递给报表的参数名与参数值,格式如[{"name":para1name,"value":para1value},{"name":para2name,"value":para2value},......] JSONArray parasArray = new JSONArray(args[1].toString()); // 需要判断是否是8秒内执行过的 TpObj tempWObj = wMap.get(cptname + parasArray); if (tempWObj != null) { if ((System.currentTimeMillis() - tempWObj.getExeTime()) < 8000) { rworkbook = tempWObj.getRworkbook(); } else { wMap.remove(cptname + parasArray); } } // 如果没有设置,需要生成 if (rworkbook == null) { JSONObject jo; // 定义报表执行时使用的paraMap,保存参数名与值 Map parameterMap = new HashMap<>(); if (!parasArray.isEmpty()) { for (int i = 0; i < parasArray.length(); i++) { jo = parasArray.getJSONObject(i); parameterMap.put(jo.get("name"), jo.get("value")); } } // 执行报表 rworkbook = workbook.execute(parameterMap, new WriteActor()); // 保存下来 wMap.put(cptname + parasArray, new TpObj(rworkbook, System.currentTimeMillis())); } // 获取报表结果中对应Cell的值 ResultReport report = rworkbook.getResultReport(0); CellElement cellElement = ((WB) report).getCellElement(colnumber, rownumber); returnValue = cellElement.getValue().toString(); if(cellElement.getValue() instanceof ResultFormula) { returnValue = ((ResultFormula)cellElement.getValue()).getResult().toString(); } } catch (Exception e) { e.printStackTrace(); } return returnValue; } static class TpObj { private ResultWorkBook rworkbook = null; private long exeTime = System.currentTimeMillis(); public TpObj(ResultWorkBook rworkbook, long exeTime) { this.setRworkbook(rworkbook); this.setExeTime(exeTime); } public ResultWorkBook getRworkbook() { return rworkbook; } public void setRworkbook(ResultWorkBook rworkbook) { this.rworkbook = rworkbook; } public long getExeTime() { return exeTime; } public void setExeTime(long exeTime) { this.exeTime = exeTime; } } }