ASP.NET Excel匯入和匯出

iDotNetSpace發表於2010-11-09

1、Excel資料匯入到資料庫中:

//該方法實現從Excel中匯出資料到DataSet中,其中filepath為Excel檔案的絕對路徑,sheetname為表示那個Excel表;
        public DataSet ExcelDataSource( string filepath , string sheetname )
        ...{
            string strConn;
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            OleDbDataAdapter ada = new OleDbDataAdapter ( "select * from [" + sheetname + "$]", strConn );
            DataSet ds = new DataSet ();
            oada.Fill ( ds );
            return ds ;
        }

上面的程式碼實現了將Excel中的資料寫進DataSet中,實現了這一步後,你可以按照自己的需要對獲得DataSet進行處理,需要注意的一個問題是,你必須要指定sheetname,即Excel中的哪一個工作單需要匯入,否則會出現錯誤。

2、如何從Excel中獲得工作單(sheetname):

//獲得Excel中的所有sheetname。
public ArrayList ExcelSheetName ( string filepath )
...{
    ArrayList al = new ArrayList ();
    string strConn;
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties=Excel 8.0;";
    OleDbConnection conn = new OleDbConnection(strConn);
    conn.Open ();
    DataTable sheetNames = conn.GetOleDbSchemaTable
    (System.Data.OleDb.OleDbSchemaGuid.Tables,new object[]...{null,null,null,"TABLE"});
    conn.Close ();
    foreach ( DataRow dr in sheetNames.Rows )
    ...{
        al.Add ( dr[2] );
    }
    return al;
}
通過這兩步,就基本可以實現將Excel匯入到資料庫中了,具體實現中的細節問題,你可以自己在實踐中獲得。

3、將資料庫中的資料匯入Excel中,在這裡我講敘自己實踐中的兩個方法:

方法一:從最基本的寫檔案入手,將從資料庫中讀出來的資料寫入到Excel中;

//該方法實現將資料匯入到Excel檔案中,其中的DataTable dt就是你需要將資料寫入到Excel中的資料;
public void ExportExcel( DataTable dt , StreamWriter w )
...{
    try
    ...{
        for( int i = 0 ; i < dt.Columns.Count ; i ++ )
        ...{
            w.Write ( dt.Columns[i] );
            w.Write( ' ' );
        }
        w.Write ( " " );

        object[] values = new object [dt.Columns.Count];
        foreach ( DataRow dr in dt.Rows )
        ...{
            values = dr.ItemArray ;
            for ( int i = 0 ; i < dt.Columns.Count ; i++ )
            ...{
                w.Write ( values[i] );
                w.Write ( ' ' );
            }
            w.Write ( " " );
        }
        w.Flush();
        w.Close();
    }
    catch
    ...{
        w.Close();
    }
}

StreamWriter w就是你自己建立的一個流,建立該資料流時,你需要自己指定需要將資料寫入到那個檔案,即指定檔案路徑,要實現下載的話,就可以簡單的用Response.Redirect ( "指定需要被下載的檔案路徑" );

方法二:該方法實現的是將資料從DataGrid中匯入到Excel中:

//filename為Excel的名字,ToExcelGrid就是資料來源,在此為DataGrid資料來源;
private void ExportExcelFromDataGrid( string filename , System.Web.UI.WebControls.DataGrid ToExcelGrid )
...{
    Response.Clear();
    Response.Buffer=   true;    
    Response.Charset="utf-8";          
    Response.AppendHeader("Content-Disposition","attachment;filename="+Server.UrlEncode ( filename ) );    
    Response.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8");//設定輸出流為簡體中文  
    Response.ContentType   =   "application/ms-excel";//設定輸出檔案型別為excel檔案。    
    this.EnableViewState   =   false;          
    System.Globalization.CultureInfo   myCItrad   =   new   System.Globalization.CultureInfo("ZH-CN",true);  
    System.IO.StringWriter   oStringWriter   =   new   System.IO.StringWriter(myCItrad);    
    System.Web.UI.HtmlTextWriter   oHtmlTextWriter   =   new   System.Web.UI.HtmlTextWriter(oStringWriter);  
    ToExcelGrid.RenderControl(oHtmlTextWriter);    
    Response.Write(oStringWriter.ToString());  
    Response.End();
}

用該方法的時候,需要注意將DataGrid資料來源中的允許翻頁,允許排 序設定成"false",同時一些特殊行進行需要將其設定成不可視,如編輯行等,若不這樣的話,用該方法實現的資料匯入到Excel,會出現異常“需要將 XXX放入到一個具有runat=server的form窗體中”,我具體忘了XXX代表的意思,你可以在實踐中嘗試一下,就可以知道出現的錯誤。

3. .Net中匯入Excel資料時應注意的事

    從Excel向資料庫導資料的時候,最常用的方式是使用Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:"Demo.xls; Extended Properties='Excel 8.0;HDR=YES;IMEX=1'。 但 是當一列中既有數字,又有文字的時候,總是莫名其妙的出現部分資料讀不到的現象,有時是讀不到文字資料,有時是讀不到數字資料。這是為什麼呢?原來 OleDb會智慧的根據前8行的資料判斷Excel的列型別,當文字資料的行數 > 數字資料的行數時,列型別被設為文字,否則為數字。那我想讀到全部的資料該做些什麼呢?這位同學問得好,祕密就在於IMEX=1,以匯入模式讀取資料。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-677813/,如需轉載,請註明出處,否則將追究法律責任。

相關文章