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

📄 formulatefield.java

📁 Excel Report是一款基于Excel的报表生成工具
💻 JAVA
字号:
/***********************************************************************
 * Module:  FormulateField.java
 * Author:  juny
 * Created: 2006年7月13日 14:13:26
 * Purpose: Defines the Class FormulateField
 ***********************************************************************/

package net.excel.report.base.element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.excel.report.Logger;
import net.excel.report.base.BaseElement;
import net.excel.report.base.BaseField;
import net.excel.report.base.IFormulateListener;
import net.excel.report.base.ITempletContainer;
import net.excel.report.base.Parameter;
import net.excel.report.base.Position;
import net.excel.report.util.AnalyseTempletTool;
import net.excel.report.util.HelpTools;

import jxl.format.CellFormat;
import jxl.write.Formula;
import jxl.write.WritableCell;
import jxl.write.WritableCellFeatures;

/**
 * 计算域字段读写对象
 * @author juny
 */
public class FormulateField extends BaseField implements IFormulateListener {
    private static Logger log = Logger.getLogger(FormulateField.class);
    /**
     * @param container
     */
    public FormulateField(ITempletContainer container) {
        super(container);
        this.listenerValues = new HashMap();
    }
    
    /*
     * (non-Javadoc)
     * @see net.excel.report.base.IElementWriter#setElementTempletValue(java.lang.String)
     */
    public void setElementTempletValue(String value) {
        formulateContent = new StringBuffer();
        formulateContent.append(AnalyseTempletTool.getElementDeclare(value));
	    if(AnalyseTempletTool.haveVariableName(formulateContent)){
	        this.setName(AnalyseTempletTool.getVariableName(formulateContent));
	    }else{
	        this.setName(value);
	    }
	    this.insertFieldListeneres(formulateContent);
    }
    
    /*
     * (non-Javadoc)
     * @see net.excel.report.base.BaseField#writeImpl(net.excel.report.base.Parameter)
     */
    public boolean writeImpl(Parameter param) throws Exception {
        String value = null;
        Formula f = null;
        WritableCell cell = param.wc;
        
        value = this.getValue();

        if (!"".equals(value) && !value.equals(formulateContent.toString())) {
            f = new Formula(param.destCol, param.destRow, value);
            CellFormat cellformat = cell.getCellFormat();
            WritableCellFeatures wcf = cell.getWritableCellFeatures();
            if(null != cellformat){
                f.setCellFormat(cellformat);
            }
            if(null != wcf){
                f.setCellFeatures(wcf);
            }
            param.wc = f;
            
            //重置字段状态
            this.reset();
        }else{
            Position pos = new Position(cell.getColumn(), cell.getRow());
            log.error("Fail to get the formulate cell's value. [" + pos.getPositionExcelDec() + "]");
            param.wc = copyDefaultCell(param, "");
        }
        return true;
    }
    
    /* 
     * @see excel.report.util.IFormulateListener#setValue(int, int, java.lang.String)
     */
    public void setValue(String sourceName, Object value, int col, int row) {
        List listenerValue = (List)this.listenerValues.get(sourceName);
        if(null != listenerValue){
            listenerValue.add(new Position(col, row));
        }
    }

    /* 
     * @see excel.report.util.IFormulateListener#reset()
     */
    public void reset() {
        String name = null;
        List listenerValue = null;
        
        //清除所有保存监听结果值容器中的数据
        for(int i=0; i<this.listenerFields.size(); i++){
            name = AnalyseTempletTool.getElementDeclare((String)listenerFields.get(i));
            listenerValue = (List)listenerValues.get(name);
            if(null != listenerValue){
                listenerValue.clear();
            }
        }
    }
    
    /**
     * 
     * @return
     */
    private String getValue(){
        String listenerValue = null;
        String value = this.formulateContent.toString();
        String fieldName = null;
        //遍历所有字段监听的结果,并将结果填入到计算域表达式中
        for(int i=0; i<this.listenerFields.size(); i++){
            fieldName = AnalyseTempletTool.getElementDeclare((String)listenerFields.get(i));
            listenerValue = getFieldsInfo(fieldName);
            if(!"".equals(listenerValue)){
                //value = value.replace((String)listenerFields.get(i),listenerValue);
                value = HelpTools.replace(value, (String)listenerFields.get(i), listenerValue);
            }
        }
        return value;
    }
    
    /**
     * 取得
     * @param fieldName	
     * @return
     */
    private String getFieldsInfo(String fieldName){
        List listenerValue = (List)this.listenerValues.get(fieldName);
        byte isHorizon = 0;//1水平,2垂直,0无状态
        StringBuffer fieldsInfo = new StringBuffer();
        int cellCount = 0;
        
        if(null != listenerValue && listenerValue.size()>0){
            Position pos = (Position)listenerValue.get(0);
            Position nextPos = null;
            fieldsInfo.append(pos.getPositionExcelDec());
            int i = 0;
            for(i=1; i<listenerValue.size(); i++){
                nextPos = (Position)listenerValue.get(i);
                if(pos.isNextPos(nextPos, true)){ 
                    //如果下一个位置是否是水平相邻的单元格
                    if(isHorizon == 2 ){
                        fieldsInfo.append(":" + pos.getPositionExcelDec());
                        fieldsInfo.append("," + nextPos.getPositionExcelDec());
                        cellCount ++;
                    }
                    isHorizon = 1;
                    pos = nextPos;
                }else if(pos.isNextPos(nextPos, false)){
                    //如果下一个位置是垂直相邻的单元格
                    if(isHorizon == 1){
                        fieldsInfo.append(":" + pos.getPositionExcelDec());
                        fieldsInfo.append("," + nextPos.getPositionExcelDec());
                        cellCount++;
                    }
                    isHorizon = 2;
                    pos = nextPos;
                }else{
                    if(isHorizon != 0){
                        fieldsInfo.append(":" + pos.getPositionExcelDec());
                    }
                    fieldsInfo.append("," + nextPos.getPositionExcelDec());
                    cellCount ++;
                    isHorizon = 0;
                    pos = nextPos;
                }
                //nextPos = null;
                if(cellCount >= SUPPERT_MAX_CELLS){
                    //大于最大可承受的单元格数则发出一个警告
                    log.warn("Out of the max supperted cell numbers! " +
                    		"formulate name:" + 
                    		this.getName());
                    return "";
                }
            }
            
            if(nextPos != null){
                //pos = (Position)listenerValue.get((i-2));
                //如果下一个位置是否是水平相邻的单元格
                if(isHorizon == 1 || isHorizon == 2){
                    fieldsInfo.append(":" + nextPos.getPositionExcelDec());
                }/*else{
                    fieldsInfo.append("," + nextPos.getPositionExcelDec());
                }*/
            }
        }
        return fieldsInfo.toString();
    }
    
    private List getNeedListenerFields(StringBuffer content){
        List fields = AnalyseTempletTool.getAllSubInfo(
				content.toString(),
				AnalyseTempletTool.REGEX_FIELD_TEMPLET);
        String field = null;
        //去掉重复的字段名称
		for(int i=0; i<fields.size(); i++){
		    field = (String)fields.get(i);
		    for(int j=i+1; j<fields.size(); j++){
		        if(field.equals((String)fields.get(j))){
		            fields.remove(j);
		        }
		    }
		}
        return fields;
    }
    
    /**
     * 根据模板定义的字段信息,在相应字段中插入计算域监听器
     * @param content
     */
    private void insertFieldListeneres(StringBuffer content){
		listenerFields = getNeedListenerFields(content);
		BaseElement element = null;
		ITempletContainer ictr = this.getTopContainer();
		String name = null;
        for(int i=0; i<listenerFields.size(); i++){
            name = AnalyseTempletTool.getElementDeclare((String)listenerFields.get(i));
            
            element = ictr.getElement(name);
            if(null != element){
                element.addListener(this);
                this.listenerValues.put(name, new ArrayList());
            }else{
                log.warn("Couldn't find any field instance in templet. Field name is " + listenerFields.get(i));
            }
        }
    }

    private List listenerFields = null;
    private Map listenerValues = null;
    private StringBuffer formulateContent = null;
    private static final byte SUPPERT_MAX_CELLS = 30;
    private static final int SUPPERT_MAX_CHAR_NUMBER = 1024;
}

⌨️ 快捷键说明

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