Excel底层实现是使用C/C++实现的,而我若使用JAVA语言,首先需要对单元格进行对象化,即用一个Cell类来表示每一个单元格(实际上就是一个数据结构);
在我编程过程中,在设计一个简单的类时,往往需要从其父类、接口、Field、Method等几个方面进行分析,以满足功能、性能、可拓展性的要求。
1)接口分析
Serializable接口,EXCEL单元格需要实现复制功能,或者拖拽功能,就必须进行复制(必须为深复制),所以需实现Serializable接口,通过流的方法进行深复制
Comparable接口,单元格若需要进行排序,必须实现CompareTo方法。
2)Field分析
Field的作用是,总结下来说是用来标识单元格与保存单元格信息这2个作用的。
int row;int col; 相当于Cell数据结构的主键,可以通过HashMap获取单元格。
Object value; 相当于单元格只缓存,保存单元格的经过公式计算后的值。如1+1=2,则value值为2。
String function; 保存公式的字符串。如A3=A1+A2,就需要在A3中保存"A1+A2"字符串。
boolean calculated; 借助的是缓存思想,保证每次只计算一次值;比如在计算前,所有Cell的calculated=false;有一次计算是,A1=1/3+1;A2=A1*3;则会在A1=1/3+1;中计算一次A1,设置A1的calculated=true,将值保存到value中;而在计算A2=A1*3时,先检查A1已经计算,直接替换成value即可。
ArrayList<Cell> relationCell; 保存相关单元格,如A3=A1+A2,那么relationCell就保存A1、A2单元格,这个是用于在A1或A2单元格数值发生变化时,通知A3的。
boolean visible; 标记单元格是否可见,实现Excel隐藏单元格功能。
Branch branch;格式刷对象,(Branch 类不赘述,用来保存前景色,背景色,字体等数据)
3)方法分析
clone() 方法,实现单元格深复制
compareTo(Cell cell),实现两个单元格比较
calculate方法,实现公式解析与计算
setVisible方法,设置是否可见
save方法,通过StringBuffer实现将Cell信息转化为String类型,方便与Excel交互
readBranch(Branch branch)方法,实现单元格格式刷
通过上述分析可以实现简单的EXCEL单元格功能。