项目引入模式的案例——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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
具体如下图所示:
上图模板经过解析后的结果图:
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- Java设计模式之适配器设计模式(项目升级案例)
- Builder设计模式——自由的扩展你的项目
- 【项目实战】Java POI之Excel导出经典案例三
- 【项目实战】Java POI之Excel导出经典案例四
- C++第4周项目5 - 数组作数据成员(扩展2、3引入文件)
- 大数据之Hive之扩展项目Youtube案例<三>
- poi导出Excel与项目的结合-案例(包含图片的设置)
- 自由扩展你的项目——Builder模式
- 【项目实战】Java POI之Excel导出经典案例一
- 将C++托管扩展项目从纯粹的中间语言转换成混合模式
- Linux企业级项目实践之网络爬虫(20)——扩展成为规则插件模式
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何实现从字符串中提取需要的字符并赋值给指定单元格内
- 项目管理案例 万科的管理模式
- 【项目实战】Java POI之Excel导出经典案例二
- 自由扩展你的项目——Builder模式
- Linux企业级项目实践之网络爬虫(20)——扩展成为规则插件模式
- 开发最前沿:项目案例实战之桥模式
- 2.easyui+ztree案例:在项目中引入easyui
- 大数据之Hive之扩展项目Youtube案例<一>
- (随记八)Android设计模式解析与实战_自由扩展项目_Builder模式_定义与简单实现