Com.urp.command.FileFrameWork(6)
上期写的文章后面,林子朋友回复说要我看看他封装的ExcelManager,去看了一下,写的不错,功能上可以说比我的excelHelper强了好多,包括的字体,背景,模版等内容。要说明的是,我写的helper只提供了一个快速读取和写入的解决办法,并不是为了封装excel的操作而封装,只是因为内容的需要,为了使自己的东西用起来方便而已,并不能拿来作为一个单独的类库使用的,希望对我写的内容有兴趣朋友要注意这一点。就算最后形成了可重用的类库,其主要作用也是封装的导入导出,我期望告诉大家的是我的思考过程。
还有朋友提到要完整的代码和使用的例子,其实我一直认为看别人的代码是一件很累的事,不过看例子倒是一个不错的选择,那以后会增加一些实例。
这次先来说一下我的项目里是怎么使用这个helper类的。一般的helper类都是用静态方法来实现的,但是我写的这个并不是这样子做的,因为考虑到速度的问题,不想每次都要来打开关闭文件,这一点是不能作为一个单独的类库的又一个原因。访问excel提供com,ADO两种方法,而我把这两种方法封装在了一个类里面,那么形式上肯定是调用helper的类会有两个,所以就有了两个类ADOExcel,ComExcel。经过修改和原来的类图可能有不一样,FileType包就变成现在的样子了:
所有涉及到具体类型的读写处理放到AbstractFileAPI子类来实现,也就是ADOExcel,ComExcel作用我们举一个ComExcel的例子看一下,代码如下:
然后涉及到流操作的那么都是有AbstractFileAPI来完成的,代码如下:
现在就能看出ExcelHelper,ArrayCollection的作用了,ArrayCollection的作用就相当于table,用来保存数据的,ComExcel通过调用ExcelHelper这个代理来实现功能。
AbstractBuilder类里有两组方法,一组是导入的时候调用的,一组是导出的时候调用的
再来举个例子,看一个初始化一个导入,Excel文件,的过程,交换类用 Collection。
1. 实例化一个AbstractBuilder,来决定使用何种交换类型
2. 实例化一个ImportDirector
ImportDirector director = new ImportDirector(fileUpload.InputStream, modelName, fileUpload.ContentType, builder);
3. 实例化IFileAPI, IdataAdapter
_dataAdapter = director.Build();
ImportDirector的Build()方法如下:
public IDataAdapter Build()
{
IFileAPI fileAPI = builder.InstanceFileAPI(inputStream, modelName, fileType);
IDataAdapter dataAdapter = builder.InstanceDataAdapter(modelName);
dataAdapter.FileAPI = fileAPI;
return dataAdapter;
}
这样子就把IFileAPI,IdataAdapter的实例化都提到了Builder包里,各自FileAPI层, DataAdapter层就不用去关心如何创建了。
freewiller.cnblogs.com