private void Invoke()
    {
        ArrayList arrlist = new ArrayList();
        DataTable tab1 = UtlBiz.GetDefaultTransaction().GetTable( "select * from Customers" );
        DataTable tab2 = UtlBiz.GetDefaultTransaction().GetTable( "select * from Employees" );
        arrlist.Add( tab1 );
        arrlist.Add( tab2 );
        string webFileTmp = "Files\\aaa.xls";//模板路径
        string webFileTar = "Files\\ttt.xls";//目标路径
        string phyFileTmp = Server.MapPath( webFileTmp );//模板路径
        string phyFileTar = Server.MapPath( webFileTar );//目标路径
        ExcDataOnTmpA( arrlist, phyFileTmp, phyFileTar );
    }

    //============================================================
    //导出文件(需要源文件名和模板文件名)
    //============================================================ 

private void ExcDataOnTmpA( ArrayList arrlist, string tmpFileName, string phyFileTar )
    {
        // Copy File to tarFileName
        CopyFile( tmpFileName, phyFileTar );
        ArrayList substItemList = GetSubstCellList( phyFileTar, 1, 100, 100 );
        SubstituteCellData( arrlist, substItemList, phyFileTar );
    }
    //============================================================
    //复制模板文件 
    //============================================================ 

private bool CopyFile( string phyFileTmp, string phyFileTar )
    {
        if( !File.Exists( phyFileTmp ))
                return false;    
        try{
            File.Copy( phyFileTmp, phyFileTar, true );
            return true;
        }catch( Exception ex ){
             return false;
        }
    }
   
    //============================================================
    //填充单元格并保存目标文件
    //============================================================

 

private void SubstituteCellData( ArrayList arrList, ArrayList subsItemList, string phyFileTar )
    {
        Excel.Application excelApp = new Excel.ApplicationClass(); //创建一个Application对象

      
        Excel.Workbook workBook = excelApp.Workbooks._Open( phyFileTar, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                    Missing.Value, Missing.Value, Missing.Value, Missing.Value );
        Excel.Worksheet workSheet = ( Excel.Worksheet )workBook.ActiveSheet;
        try{
            //遍历单元格
           CopyExcelFormat( workSheet, arrList, subsItemList );
           foreach ( SubstCell substCell in subsItemList ) FillSubstCellData( workSheet, arrList, substCell );//填充单元格
           workBook.Save();
        }catch( Exception Er ){
            throw new Exception( "调用EXCEL程序出现错误!" + Er.Message );
        }finally{
            if( workBook != null ) workBook.Close( false, Missing.Value, Missing.Value );              
            if( excelApp != null ) excelApp.Quit();
        }
    }
    //===============================================================
    //验证格式是否为0:MAmount:F并判断是否是多行记录并填充数据。T代表的是多行
    //===============================================================   

private void FillSubstCellData( Excel.Worksheet workSheet, ArrayList dataList, SubstCell substCellItem )
    {
        string cellStr = substCellItem.cellStr;//定义的单元格内容
        ArrayList strList = UtlMisc.GetItemsListFromString( cellStr, ":" );//单元格内容用":"隔开
        int dataIndex = int.Parse(strList[0].ToString());//取数据集中第几张表
        string fieldName = strList[1].ToString();//取表中的字段名
        bool isList = strList[2].ToString().ToUpper() == "T";//判断是否是多行记录
        if( isList ){//如果是多行记录     
            DataTable tbl = dataList[ dataIndex ] as DataTable;//把符合条件的转换成datatable类型             
            //复制单元格格式
            for ( int i = 0; i < tbl.Rows.Count - 1; i++ ){                                     
                    workSheet.Cells[ substCellItem.rowIndex + i, substCellItem.coluIndex ] = tbl.Rows[i][fieldName]; }               
        }else{       
            workSheet.Cells[ substCellItem.rowIndex, substCellItem.coluIndex ] = ((DataTable)dataList[dataIndex]).Rows[0][fieldName];
        }       
    }

    //=============================================================
    //复制格式
    //=============================================================

private void CopyExcelFormat( Excel.Worksheet workSheet, ArrayList dataList, ArrayList subsItemList )
    {
        int copyRowCount = 0;
        foreach( SubstCell substCell in subsItemList ){
            string cellStr = substCell.cellStr;//定义的单元格内容
            ArrayList strList = UtlMisc.GetItemsListFromString( cellStr, ":" );//单元格内容用":"隔开
            int dataIndex = int.Parse( strList[0].ToString() );//取数据集中第几张表
            string fieldName = strList[1].ToString();//取表中的字段名
            bool isList = strList[2].ToString().ToUpper() == "T";//判断是否是多行记录
            if( isList ){//如果是多行记录
                DataTable tbl = dataList[dataIndex] as DataTable;
                int rowsCount = tbl.Rows.Count;
                if ( rowsCount > copyRowCount ) copyRowCount = rowsCount;               
            }
        }
        for( int i = 1; i < copyRowCount - 1; i++ ){
            (( Excel.Range )workSheet.Rows[7, Type.Missing] ).Copy( Type.Missing );
            (( Excel.Range )workSheet.Cells[7 + i, 1] ).EntireRow.Insert( 0, 0 );
            for( int j = 1; j < workSheet.UsedRange.Columns.Count +3 ; j++ )  workSheet.Cells[7 + i, j] = "";                 
        }
    }


    //===========================================================
    //模板的行、列和单元格
    //===========================================================
  

  public struct SubstCell
    {
        public int rowIndex;//模板的行
        public int coluIndex;//模板的列
        public string cellStr;//模板的单元格数据
    }
    //============================================================
    //判断格式0:MAmount:F
    //============================================================

private bool IsDataFieldCell( string cellStr )
    {
        if( string.IsNullOrEmpty( cellStr )) return false;//判断是否为空或""
        ArrayList list = UtlMisc.GetItemsListFromString( cellStr, ":" );//截取字符串并用":"隔开
        if( list.Count != 3 ) return false;//判断字符串的个数是否为3
        if( !UtlMisc.IsIntString( list[0].ToString()) ) return false;//判断第一个字符是否是数字
        return true;
    }


    //===========================================================
    //读取Excel,取出单元格
    //===========================================================
   

private ArrayList GetSubstCellList( string phyFileTar, int sheetIndex, int rowCount, int columnCount )
    {
        Excel.ApplicationClass excelApp = new Excel.ApplicationClass();
        //打开模板文件,得到WorkBook对象
        Excel.Workbooks workBooks = excelApp.Workbooks;
        Excel.Workbook workBook = workBooks._Open( phyFileTar, Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value
            , Missing.Value, Missing.Value, Missing.Value, Missing.Value );
        ArrayList list = new ArrayList();
        try{
            //得到worksheet对象
            Excel.Worksheet workSheet = ( Excel.Worksheet )workBook.Sheets[sheetIndex];//找到所需要的sheet
            if( workSheet == null ) return null;
            if( rowCount == 0 ) rowCount = workSheet.UsedRange.Rows.Count;//设置已用单元格的行数
            if( columnCount == 0 ) columnCount = workSheet.UsedRange.Columns.Count;//设置已用单元格的列数
            for( int i = 1; i <= rowCount; ++i )
                for( int j = 1; j <= columnCount; ++j ){
                    SubstCell cellItem = new SubstCell();//创建单元格对象
                    cellItem.rowIndex = i;
                    cellItem.coluIndex = j;
                    Excel.Range range = (Excel.Range)workSheet.Cells[i, j];//取出单元格
                    if( range.Value2 != null )
                        cellItem.cellStr = range.Value2.ToString();
                    if( IsDataFieldCell(cellItem.cellStr )) list.Add( cellItem );
                }
        }catch ( Exception Er ){
            throw new Exception( "调用EXCEL程序出现错误!" + Er.Message );
        }
        finally{
            if( workBook != null ) workBook.Close( false, Missing.Value, Missing.Value );
            if( workBooks != null ) workBooks.Close();
            if( excelApp != null ) excelApp.Quit();
        }
        return list;
    }
}