📄 formulatefield.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 + -