这么一个多月来,过得比较的沉闷,主要精力都放在了给老师做的多个Excel之间的处理。刚接到任务时还比较的莫名其妙,处理Excel?首先是一片空白,不过马上想到了开源的API,我选了jxl,比较的好用。接着的一两周还是感觉不知道到底要怎么做,老师也没说要怎么做,他也没概念,考虑了一段时间后有了两个要做什么的模型:1. 多个子Excel的纪录累计到一个总的Excel中(例如工厂里每个月份都有一个Excel文件记录该月的某方面的生产情况,生成一年的纪录则需合并12个月的纪录文件);2. 多个Excel数据文件数据累计统计到一个总的Excel文件中(例如每个月的各产品的生产量统计成一年的总量)。
知道做什么了就好办了,不过想到一旦规则改变了怎么办?记录累积时导入的情况复杂点怎么办?还有更多的用户应用怎么办?所以多个Excel导入到单个Excel的规则一定要灵活。最近不久刚看了Hibernate,那个ORM映射思想正在脑子里热着,把JavaBean中的DTO与数据库映射起来,从而利用框架省去了DAO,减轻了开发工作。而利用XML来作灵活的配置是不可少的。处理Excel的导入规则时利用XML Mapping映射看来可以方便和灵活不少。
从源Excel到目标Excel整个Excel的XML Mapping映射文件采用这样的设计:(1)首先将Excel表分成区域(area),每个area有个有效的范围(rigion),需要处理的源(original)Excel文件和存放处理后的目标(target)Excel文件都有个开始单元格和结束单元格,这之间的矩形就是有效区域;当然area可以多个;(2)然后将一个区域需处理的单元格定义一列(col)或一行(row)头单元格(header),当然也有源(original)和目标(target)矩形区域,头单元格里还有个标记就是操作(operation),记录从源Excel到目标Excel的操作(op)处理规则是什么;header可以多个;(3)可能看起来好像没有标记需处理的真正单元格,其实rigion减去header就是需处理的单元格;(4)需特别处理的头(header-extra),这里还没用上,以防以后特殊用途吧;header-extra可以多个。
然后在程序两中采用个MappingBean来存储XML文件的信息就Ok了。
这里附上一个模板XML:
< excel-mapping >
< remark > 这个模型的是将多个excel文件的记录合并到一个总excel里,采用操作为:record </ remark >
<!-- erea可以多个 -->
< area >
< region > <!-- 作用域:只作用于指定的这块方形区域里 -->
< original beginX ="0" beginY ="6" endX ="2" endY ="12" >
</ original >
< target beginX ="0" beginY ="6" endX ="10" endY ="12" ></ target >
</ region >
<!-- 一个区域需处理的一列(col)或一行(row)头单元格(header) ;header可以多个 -->
< header >
<!-- col 表示头标签为列; row 表示头标签为行 -->
< original type ="col" beginX ="1" beginY ="6" endX ="1"
endY ="12" >
</ original >
< target type ="col" beginX ="1" beginY ="6" endX ="1"
endY ="12" >
</ target >
< operation op ="record" expression ="" >
<!-- 操作:
add-单元格累加;
minus-单元格相减;
nultiply-单元格相乘;
devide-单元格相除;
expression-其他自定义表达式,参数为此时expression属性为定义的表达式;
record-表示记录型累积 -->
</ operation >
</ header >
<!-- header-extra可能是多余的,但留着以便以后利用 ;header-extra可以多个 -->
< header-extra >
<!-- col 表示头标签为列; row 表示头标签为行 -->
< original type ="col" beginX ="1" beginY ="6" endX ="1"
endY ="32" >
</ original >
< target type ="col" beginX ="1" beginY ="6" endX ="1"
endY ="32" >
</ target >
< operation op ="record" expression ="" ></ operation >
</ header-extra >
</ area >
< area >
< region > <!-- 作用域:只作用于指定的这块方形区域里 -->
< original beginX ="0" beginY ="6" endX ="2" endY ="32" >
</ original >
< target beginX ="0" beginY ="6" endX ="10" endY ="32" ></ target >
</ region >
< header >
<!-- col 表示头标签为列; row 表示头标签为行 -->
< original type ="col" beginX ="1" beginY ="14" endX ="1"
endY ="32" >
</ original >
< target type ="col" beginX ="1" beginY ="14" endX ="1"
endY ="32" >
</ target >
< operation op ="record" expression ="" >
</ operation >
</ header >
< header-extra >
<!-- col 表示头标签为列; row 表示头标签为行 -->
< original type ="col" beginX ="1" beginY ="6" endX ="1"
endY ="32" >
</ original >
< target type ="col" beginX ="1" beginY ="6" endX ="1"
endY ="32" >
</ target >
< operation op ="record" expression ="" ></ operation >
</ header-extra >
</ area >
</ excel-mapping >
就说到这,看懂了应该还是挺简单的,因为业务现在还算简单,够用了,希望读者或高手可以提出更多的想法或建议!谢谢!