⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analysetemplettool.java

📁 Excel Report是一款基于Excel的报表生成工具
💻 JAVA
字号:
/*
 * Created on 2006-7-28
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package net.excel.report.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * TODO :模板语法分析共用类,本类用来对定义的模板语法进行分析,其封装了所有于模板分析有关
 * 的函数,并将模板定义相关的关键字和语法分析部分集中在一起,便于管理和维护。
 * @author juny
 * @since 1.0
 */
public final class AnalyseTempletTool {
    /**
     * 判断传入的内容是否是一个模板元素
     * @param content 模板定义元素内容。(字符串描述)
     * @return true:当前传入内容是一个模板元素定义描述。 <br>
     * false当前传入内容不是一个模板元素定义描述。
     */
    public static boolean isTempletElement(String content){
        if(content.startsWith("$") && content.endsWith("}")){
            return true;
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否是一个字段类型的模板元素定义。
     * @param templet 模板定义内容。
     * @return true 传入字符串是一个字段类模板元素定义。<br>
     * false 传入字符串不是一个字段类模板元素定义。
     * @since 1.0
     */
    public static boolean isFieldTemplet(String templet){
        if(templet.startsWith(KEY_ELEMENT_FIELD)){
            return true;
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否是一个参数类型的模板元素定义。
     * @param templet 模板定义内容。
     * @return true 传入字符串是一个参数类模板元素定义。<br>
     * false 传入字符串不是一个参数类模板元素定义。
     * @since 1.0
     */
    public static boolean isArgumentTemplet(String templet){
        if(templet.startsWith(KEY_ELEMENT_ARGUMENT)){
            return true;
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否是一个变量类型的模板元素定义。
     * @param templet 模板定义内容。
     * @return true 传入字符串是一个变量类模板元素定义。<br>
     * false 传入字符串不是一个变量类模板元素定义。
     * @since 1.0
     */
    public static boolean isVariableTemplet(String templet){
        if(templet.startsWith(KEY_ELEMENT_VARIABLE)){
            return true;
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否是一个Band类型的模板元素定义。
     * @param templet 模板定义内容。
     * @return true 传入字符串是一个Band类模板元素定义。<br>
     * false 传入字符串不是一个Band类模板元素定义。
     * @since 1.0
     */
    public static boolean isBandTemplet(String templet){
        if(templet.startsWith(KEY_ELEMENT_BAND)){
            return true;
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否是一个Group类型的模板元素定义。
     * @param templet 模板定义内容。
     * @return true 传入字符串是一个Group类模板元素定义。<br>
     * false 传入字符串不是一个Group类模板元素定义。
     * @since 1.0
     */
    public static boolean isGroupTemplet(String templet){
        if(templet.startsWith(KEY_ELEMENT_GROUP)){
            return true;
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否含有head属性描述,如果有head属性描述在代表当前Band/Group Head
     * 部分的开始。该函数首先会检查传入内容是否是一个Band或Group的模板描述,不是则直接返回
     * false。
     * @param templet 传入模板定义内容。
     * @return true 当前传入模板是head。<br>
     * false 当前传入模板不是head.
     * @since 1.0
     */
    public static boolean isHead(String templet){
        if(isBandTemplet(templet) || isGroupTemplet(templet)){
            if(getPorperty(templet, PROPERTY_PROPE).equals(BAND_HEAD)){
                return true;
            }
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否含有body属性描述,如果有body属性描述在代表当前Band/Group body
     * 部分的开始。该函数首先会检查传入内容是否是一个Band或Group的模板描述,不是则直接返回
     * false。
     * @param templet 传入模板定义内容。
     * @return true 当前传入模板是body。<br>
     * false 当前传入模板不是body.
     * @since 1.0
     */
    public static boolean isDetail(String templet){
        if(isBandTemplet(templet) || isGroupTemplet(templet)){
            if(getPorperty(templet, PROPERTY_PROPE).equals(BAND_BODY)){
                return true;
            }
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否含有foot属性描述,如果有foot属性描述在代表当前Band/Group foot
     * 部分的开始。该函数首先会检查传入内容是否是一个Band或Group的模板描述,不是则直接返回
     * false。
     * @param templet 传入模板定义内容。
     * @return true 当前传入模板是foot。<br>
     * false 当前传入模板不是foot.
     * @since 1.0
     */
    public static boolean isBottom(String templet){
        if(isBandTemplet(templet) || isGroupTemplet(templet)){
            if(getPorperty(templet, PROPERTY_PROPE).equals(BAND_FOOT)){
                return true;
            }
        }
        return false;
    }
    
    /**
     * 判断传入字符串是否含有end属性描述,如果有end属性描述在代表当前Band/Group end
     * 部分的开始。该函数首先会检查传入内容是否是一个Band或Group的模板描述,不是则直接返回
     * false。
     * @param templet 传入模板定义内容。
     * @return true 当前传入模板是end。<br>
     * false 当前传入模板不是end.
     * @since 1.0
     */
    public static boolean isEnd(String templet){
        if(isBandTemplet(templet) || isGroupTemplet(templet)){
            if(getPorperty(templet, PROPERTY_PROPE).equals(BAND_END)){
                return true;
            }
        }
        return false;
    }
    
    /**
     * 从传入模板定义内容(templet)中取得指定属性的属性值。
     * @param templet 模板定义内容
     * @param propertyName 属性名称
     * @return 返回取得的属性值
     * @since 1.0
     */
    public static String getPorperty(String templet, byte propertyName){
        String strRet = null;
        //取出属性名及对应的值
        switch(propertyName){
        	case PROPERTY_NAME:
        	    strRet = getSubInfo(templet, REGEX_NAME);
        	    break;
        	case PROPERTY_PROPE:
        	    strRet = getSubInfo(templet, REGEX_PROPERTY);
        	    break;
        	case PROPERTY_DATASOURCE:
        	    strRet = getSubInfo(templet, REGEX_DATASOURCE);
        	    break;
        	default:
        	    ;
        }
        //取出属性值
        if(null != strRet){
            strRet = getSubInfo(strRet, REGEX_VALUE);
            if(!"".equals(strRet)){
	            //过滤掉一前一后的标识字符,取得属性对应的值.
	            strRet = strRet.substring(1, strRet.length() - 1).trim();
            }
        }else{
            strRet = "";
        }
        //返回属性对应的值
        return strRet;
    }
    
    /**
     * 利用正则表达式查找输入字符串中的一个子串,检索条件由searchRegex来指定。
     * @param content 传入需要查找的字符串。
     * @param searchRegex 传入查找条件,(一个正则表达式描述的字符串)。
     * @return 找到返回查找到的结果。
     */
    public static String getSubInfo(String content, String searchRegex){
        Matcher matcher = Pattern.compile(searchRegex).matcher(content);
        if(matcher.find()){
            //return matcher.toMatchResult().group();
            return content.substring(matcher.start(), matcher.end());
        }
        return "";
    }
    
    /**
     * 利用正则表达式查找输入字符串中的一个子串,检索条件由searchRegex来指定。
     * 其于getSubInfo(String, String)主要区别在于,后者只能返回一个结果。
     * @param content 传入需要查找的字符串。
     * @param searchRegex 传入查找条件,(一个正则表达式描述的字符串)。
     * @return 找到则返回查找到的结果,结果是一个用List保存的结果列表。
     */
    public static List getAllSubInfo(String content, String searchRegex){
        Matcher matcher = Pattern.compile(searchRegex).matcher(content);
        ArrayList list = new ArrayList();
        while(matcher.find()){
            list.add(content.substring(matcher.start(), matcher.end()));
        }
        return list;
    }
    
    /**
     * 取得模板变量声明的内容。
     * @param elementTemplet 传入模板定义内容。
     * @return 返回模板定义的实际内容,去掉描述符。
     */
    public static String getElementDeclare(String elementTemplet){
        return elementTemplet.substring(3, elementTemplet.length()-1);
    }
    
    /**
     * 判断一个模板变量是否定义了变量名称。每个模板变量都可以定义一个别名,
     * 以便在其他地方可以通过该名称引用该变得值。
     * @param content 传入模板定义内容。
     * @return true 当前模板存在变量名<br>
     * 
     */
    public static boolean haveVariableName(StringBuffer content){
        return content.charAt(0) == KEY_FIELD_NAME_DEFINE_BEGIN;
    }
    
    /**
     * 取得变量模板中定义的变量名称
     * @param content 模板定义内容
     * @return 如果模板定义了别名,则返回该别名,并删除原模板定义内容中定义别名部分。<br>
     * 否则返回null。
     */
    public static String getVariableName(StringBuffer content){
        int pos = content.lastIndexOf(AnalyseTempletTool.KEY_FIELD_NAME_DEFINE);
        String name = null;
        if(-1 != pos){
            name = content.substring(pos + 3, content.length()).trim();
        }
        
        //取得{}中的内容
        content.deleteCharAt(0);
        pos = content.lastIndexOf("}");
        if(-1 != pos){
            content.delete(pos, content.length());
        }
        return name;
    }
    
    /* 报表支持的模板变量关键字定义 */
    private static final String KEY_ELEMENT_FIELD = "$F{";
    private static final String KEY_ELEMENT_ARGUMENT = "$P{";
    private static final String KEY_ELEMENT_VARIABLE = "$V{";
    private static final String KEY_ELEMENT_BAND = "$B{";
    private static final String KEY_ELEMENT_GROUP = "$G{";
    
    /* band 或者 group属性读取的表达式定义 */
    private static final String REGEX_NAME = "[nN]ame\\s*=.*?[;\\}]";
    private static final String REGEX_PROPERTY = "[pP]roperty\\s*=.*?[;\\}]";
    private static final String REGEX_DATASOURCE = "[dD]ata[sS]ource\\s*=.*?[;\\}]";
    private static final String REGEX_VALUE = "=.*[;\\}]";
    //模板变量--该表达式描述一个模板变量定义语法
    public static final String REGEX_FIELD_TEMPLET = "\\$[fFpPvVbBgG]\\{.*?\\}";
    public static final byte PROPERTY_NAME = 1; //取模板中的name属性值
    public static final byte PROPERTY_PROPE = 2;//取模板中的property属性值
    public static final byte PROPERTY_DATASOURCE = 3; //取模板中的DataSource属性值 
    
    /* 字段表达式中数据源与字段名之间的分隔符定义 */
    public static final String DATASOURCE_FIELD_SEPARATOR_REGEX = "\\.";
    public static final String DATASOURCE_FIELD_SEPARATOR = ".";
    
    /* 带区域支持的属性定义 */
    public static final String BAND_HEAD = "head";
    public static final String BAND_BODY = "body";
    public static final String BAND_FOOT = "foot";
    public static final String BAND_END = "end";
    
    
    /* 计算域相关模板常量定义区 */
    public static final String REGEX_FIELD_BODY = "\\{.*\\}";
    public static final String KEY_FIELD_NAME_DEFINE = "as ";
    public static final char KEY_FIELD_NAME_DEFINE_BEGIN = '{';
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -