cn.joylau.office.excel.support.template.expression.GroovyExpressionRunner Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright (c) 2017 by JoyLau. All rights reserved
******************************************************************************/
package cn.joylau.office.excel.support.template.expression;
import cn.joylau.commons.utils.StringUtils;
import cn.joylau.scripts.engine.DynamicScriptEngine;
import cn.joylau.scripts.engine.DynamicScriptEngineFactory;
import cn.joylau.scripts.engine.ExecuteResult;
import org.apache.poi.ss.usermodel.Cell;
import java.util.HashMap;
import java.util.Map;
/**
* 基于Groovy引擎的表达式执行器.
* 目前支持内容
*
* - 单元格赋值如:data.name
* - 三目运算:data.age>14:"小孩子":"大人"
* - 循环: for(list in data) ,结束循环: /for
*
* @version 1.0
*/
public class GroovyExpressionRunner implements ExpressionRunner {
private Map root = new HashMap<>();
private StringBuilder builder = new StringBuilder();
protected CellHelper helper;
private int cellNumber = 0;
private int each_flag = 0;
public void setData(Map data) {
root.putAll(data);
}
public void setHelper(CellHelper helper) {
this.helper = helper;
}
public CellHelper getHelper() {
return helper;
}
@Override
public void pushExpression(Cell cell, String expression) {
cellNumber++;
String cellName = "cell_" + cellNumber;
root.put(cellName, cell);
//如果是以for(开头,则认为表达式为循环操作
if (expression.startsWith("for(")) {
each_flag++;
builder.append(expression).append("{\n");
builder.append("\t_helper.nextRow(").append(cellName).append(");").append("\n");
} else if (expression.startsWith("/for")) {
//以/for开头,则为结束循环
if (each_flag > 0) each_flag--;
builder.append("}").append("\n");
} else if (expression.startsWith("def")) {
builder.append(expression).append(";\n");
if (each_flag <= 0)
builder.append("\t_helper.initCell(").append("''").append(",").append(cellName).append(");").append("\n");
} else {
if (each_flag > 0)
//当前为循环内
builder.append("\t_helper.nextCell(").append(expression).append(",").append(cellName).append(");").append("\n");
else
builder.append("\t_helper.initCell(").append(expression).append(",").append(cellName).append(");").append("\n");
}
}
@Override
public void run() throws Throwable {
DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine("groovy");
root.put("_helper", helper);
String script_id = StringUtils.concat("excel_expression_", builder.hashCode());
if (!engine.compiled(script_id))
engine.compile(script_id, builder.toString());
ExecuteResult executeResult = engine.execute(script_id, root);
if (executeResult.getException() != null)
throw executeResult.getException();
}
@Override
public void reset() {
cellNumber = 0;
each_flag = 0;
builder = new StringBuilder();
}
}