您的位置:首页 > 其它

项目引入模式的案例——Excel扩展单元格

2009-06-12 15:49 155 查看
前些日子做一个Excel扩展行的机制,简单说,模板-->生成文件,模板和文件均是excel文件,其中模板有很多公式,其中要说的是这个扩展行的公式#L:${}(至于如何解析Excel,有兴趣的朋友可以去了解poi和js的犀牛引擎,ps:java项目)
具体如下图所示:
  上图模板经过解析后的结果图:
DefaultCell dcell=new DefaultCell(new ExcelContext("和当前单元格相关信息"));
MergeGroupDecorator gd=new MergeGroupDecorator(dcell);
FontColorDecorator fd=new FontColorDecorator(gd);  上面写的是分组隐藏和颜色更改两个装饰使用的伪代码。
可以看到既然现在子类是由使用者实现,那么我无法估计到怎么实例化他,就是装饰子类的构造器我都无法知道我怎么实例化呢?真实使用模式我们也许根本无法完全套用模式的案例,也没必要完全模仿,我们只要把握模式的精髓就可以了。
既然无法预计怎么实例化那么就不去用构造器,我们自己定义set方法给CellDecorator,
package lovebaobao.util.template.excel;
2
3import org.apache.poi.hssf.usermodel.HSSFCellStyle;
4
5CellDecorator 装饰者基类:
package lovebaobao.util.template.excel;
2
3import org.apache.poi.hssf.usermodel.HSSFCellStyle;
4
5ExcelContext 上下文类

package lovebaobao.util.template.excel;
2
3import java.util.List;
4
5import org.apache.poi.hssf.usermodel.HSSFCell;
6import org.apache.poi.hssf.usermodel.HSSFCellStyle;
7import org.apache.poi.hssf.usermodel.HSSFFont;
8import org.apache.poi.hssf.usermodel.HSSFWorkbook;
9
10 DefaultCell 包含上下文的被装饰类:

package lovebaobao.util.template.excel;
2
3import org.apache.poi.hssf.usermodel.HSSFCellStyle;
4
5两个装饰子类(由使用者自己编程,此处为示例)
MergeGroupDecorator :
package lovebaobao.util.template;
2
3
4import java.util.List;
5
6import com.bokesoft.himalaya.util.template.excel.CellDecorator;
7
8 FontColorDecorator :
package lovebaobao.util.template;
2
3import org.apache.poi.hssf.usermodel.HSSFCellStyle;
4import org.apache.poi.hssf.usermodel.HSSFFont;
5import org.apache.poi.hssf.util.HSSFColor;
6
7import com.bokesoft.himalaya.util.template.excel.CellDecorator;
8注册所有装饰类
package lovebaobao.util.template;
2注意图Excel模板的A2和D2单元格包含注释,注释里面有装饰的描述:decorators=ItalicDecorator,FontColorDecorator
根据当前单元格构造上下文:
ExcelContext context = new ExcelContext(cellWrite,
(List) cr.result, i, book, vManager, (List) cr.result);根据上下文和当前单元格的装饰描述去已经注册的装饰字典查找然后实例化
private IExcelComponent getComponetFormComment(VariableComment vc,
2IExcelComponent iec = getComponetFormComment(vc, context);
Object valueTextResult = iec.getValue();
cellWrite.setCellStyle(iec.getStyle());
cellWrite.setCellType(iec.getType());写单元格。setCellValue(cellWrite, book, valueTextResult, cr.showCellAsError);  最后想说的是,刚刚插曲最后说我感觉老大的管道方案更好,是因为我发现我现在方案会导致每个单元格都要实例许多装饰对象,而我老大说的管道,只需要几个固定的节点对象可以反复使用。从这点看他的比较好,究其原因是我的装饰本身使用组合,而他的管道仅是保存引用,还有仔细想想管道方案就是装饰模式的一种,如果把上下文看着被装饰对象,管道节点为装饰对象,那么get和set方法实现装饰,接口是仅仅包含get和set上下文的方法,可巧的是他没用对象组合引用上下文而是选择了聚合上下文。

LoveBaoBao

作者:LoveBaoBao

出处:http://lovebaobao.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: