Mine.Net

 

关于ASP.Net的导入导出(6)

Com.urp.command.FileFrameWork6


   上期写的文章后面,林子朋友回复说要我看看他封装的ExcelManager,去看了一下,写的不错,功能上可以说比我的excelHelper强了好多,包括的字体,背景,模版等内容。要说明的是,我写的helper只提供了一个快速读取和写入的解决办法,并不是为了封装excel的操作而封装,只是因为内容的需要,为了使自己的东西用起来方便而已,并不能拿来作为一个单独的类库使用的,希望对我写的内容有兴趣朋友要注意这一点。就算最后形成了可重用的类库,其主要作用也是封装的导入导出,我期望告诉大家的是我的思考过程。

还有朋友提到要完整的代码和使用的例子,其实我一直认为看别人的代码是一件很累的事,不过看例子倒是一个不错的选择,那以后会增加一些实例。

   这次先来说一下我的项目里是怎么使用这个helper类的。一般的helper类都是用静态方法来实现的,但是我写的这个并不是这样子做的,因为考虑到速度的问题,不想每次都要来打开关闭文件,这一点是不能作为一个单独的类库的又一个原因。访问excel提供comADO两种方法,而我把这两种方法封装在了一个类里面,那么形式上肯定是调用helper的类会有两个,所以就有了两个类ADOExcel,ComExcel。经过修改和原来的类图可能有不一样,FileType包就变成现在的样子了:


    所有涉及到具体类型的读写处理放到AbstractFileAPI子类来实现,也就是ADOExcel,ComExcel作用我们举一个ComExcel的例子看一下,代码如下:

/// <summary>
    
/// ComExcell 的摘要说明。
    
/// </summary>

    public class ComExcel : AbstractFileAPI
    

   然后涉及到流操作的那么都是有AbstractFileAPI来完成的,代码如下:
/// <summary>
    
/// AbstractFileAPI 的摘要说明。
    
/// </summary>

    public abstract class AbstractFileAPI : IFileAPI
    
{
        
private string _path;
        
private LocalFile _localFile = null;
        
protected string _fileName = null;
        
protected Stream _inputStream = null;    
        
protected ArrayList _columnTexts = null;

        
protected AbstractFileAPI(string path)
        
{
            _path 
= path;
            _localFile 
= new LocalFile();
        }


        
IFileAPI 成员
    }

现在就能看出ExcelHelper,ArrayCollection的作用了,ArrayCollection的作用就相当于table,用来保存数据的,ComExcel通过调用ExcelHelper这个代理来实现功能。

 

   看到这里,如果一直关注我的文章的朋友可能会想,完成一个导入导出需要用到好多子类,又要考虑文件的类型,是Excel,Xml,mdb或者是别的,又要考虑使用的交换的类型,是List,还是DataTable。每种文件类型就是两个具体的类,如此多的子类如何实例化,如何组合起来,这也是一个比较烦人的问题。常用的工厂模式可能已经解决不好了,因为在FileType包的上面,还有一层DataAdapter包。DataAdapter访问FileType包,实例化具体的IFileAPI。原来写的时候就是在DataAdapter层来实例化一个FileType层的抽象工厂FileTypeFactory,然后再调用FileTypeFactory的子类来完成实例化,现在想想,这样做可能不最好的。毕竟DataAdapter不该去关心FileType层的事情,它只要调用IFileAPI接口里的方法就可以了。所以我们改用Builder模式来实现这一要求,如图:




   AbstractBuilder
类里有两组方法,一组是导入的时候调用的,一组是导出的时候调用的


   再来举个例子,看一个初始化一个导入,Excel文件,的过程,交换类用 Collection

1.      实例化一个AbstractBuilder,来决定使用何种交换类型

2.      实例化一个ImportDirector

ImportDirector director = new ImportDirector(fileUpload.InputStream, modelName, fileUpload.ContentType, builder);

3  实例化IFileAPI  IdataAdapter

     _dataAdapter = director.Build();

     ImportDirectorBuild()方法如下:

public IDataAdapter Build()

         {

              IFileAPI fileAPI = builder.InstanceFileAPI(inputStream, modelName, fileType);

              IDataAdapter dataAdapter = builder.InstanceDataAdapter(modelName);

              dataAdapter.FileAPI = fileAPI;

              return dataAdapter;

     }


   这样子就把IFileAPIIdataAdapter的实例化都提到了Builder包里,各自FileAPI, DataAdapter层就不用去关心如何创建了。

freewiller.cnblogs.com 2006-9-12

posted on 2006-09-13 14:08  whoisyorudady  阅读(1984)  评论(1编辑  收藏  举报

导航