2010-10-19 97 views
2

我有很多excel工作表,其中列略有不同,我想將所有這些工作表(一次一個)導入到一個SQL表中。我舉一個例子:多個不同的Excel工作表放入一個SQL表格

說我編寫了所需的程序並稱之爲Excel2sql轉換器。所以Excel2sql需要一個excel工作表,並創建數據庫表與Excel表單的數據,例如說,我有以下excel表:

Excel_Sheet_1 
----------------------------- 
FirstName MiddleName LastName 
John  A.   Smith 

當我運行Excel2sql(Excel_Sheet_1),一個數據庫表應該被創建對我來說,在它下面的數據:

FirstName MiddleName LastName 
John  A.   Smith 

現在,當我用下面的excel表再次運行我的程序:

Excel_Sheet_2 
----------------------------- 
LastName FirstName MiddleName 
wolf  Kerry   M. 

我應該得到以下UP DATED分表:

FirstName MiddleName LastName 
John  A.   Smith 
Kerry  M.   wolf 

請注意,它將excel表2的數據添加到已存在的數據庫表中。 它在db的列和excel表格2的列之間做了一些映射,以適當地追加數據。現在

,如果我用下面的excel表再次運行我的程序:

Sheet 3 
-------- 
PhoneNumber LastName MiddleName FirstName 
232-232  Lame  K.  Phoebe 

我應該得到以下db表:

FirstName MiddleName LastName PhoneNumber 
John  A.   Smith  Null 
Kerry  M.   wolf  Null 
Phoebe K.   Lame  232-232 

我想要的代碼,以動態做到這一點,我意思是,任何人都可以使用我的代碼,給它一個Excel表作爲輸入,然後我的代碼將爲他創建一個SQL數據表,並且每當用戶給他一個Excel表時,它應該更新已經創建的SQL表。

請真的需要我能得到的所有幫助。我很新,在這。我寫了一個簡單的代碼,只需將一張excel表單上傳到ALREADY現有的數據表中即可。 (這不是我想要的,但我不得不開始某處)

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Data.OleDb; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 
public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void insertdata_Click(object sender, EventArgs e) 
    { 
     //-----------------connection to excel=-------------------------- 
     OleDbConnection oconn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("example.xls") + ";Extended Properties=Excel 8.0"); 
     try 
     { 
      //-----------------Commad to get all columns--------------------- 
      OleDbCommand ocmd = new OleDbCommand("select * from [Sheet1$]", oconn); 

      //-----------------open the connection----------------------- 
      oconn.Open(); 

       //-----------------execute the command ---------------------- 
      OleDbDataReader odr = ocmd.ExecuteReader(); 
      string fname = ""; 
      string lname = ""; 
      string mobnum = ""; 

       //-----------------read from the datareader------------------- 
      while (odr.Read()) 
      { 

        //-----------------insert into the db table ------------------ 
       insertdataintosql(fname, lname, mobnum); 
      } 
      oconn.Close(); 
     } 
     catch (DataException ee) 
     { 
      lblmsg.Text = ee.Message; 
      } 
     finally 
     { 
      lblmsg.Text = "Data Inserted Sucessfully"; 
     } 
    } 

    public void insertdataintosql(string fname, string lname, string mobnum) 
    { 
     //-----------------connection to sql database---------------- 

     SqlConnection conn = new SqlConnection("Data Source=.\\sqlexpress;AttachDbFileName=|DataDirectory|exceltosql.mdf;Trusted_Connection=yes"); 


     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandText = "insert into dbtable(fname,lname,mobnum) values(@fname,@lname,@mobnum)"; 
     cmd.Parameters.Add("@fname", SqlDbType.NVarChar).Value = fname; 
     cmd.Parameters.Add("@lname", SqlDbType.NVarChar).Value = lname; 
     cmd.Parameters.Add("@mobnum", SqlDbType.NVarChar).Value = mobnum; 

     cmd.CommandType = CommandType.Text; 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 
    } 

} 

再次編寫的代碼IVE是不是我想要的,你可以請幫我修改它來得到我想要的要求!

預先感謝您:)

回答

0

首先,你會讓生活稍微容易對自己,如果你創建一個包含,比方說一個最小的表,只是一個ROWID列。這樣,您就避免了在第一遍時不得不創建表的邊界情況。或者,您可以在第一階段執行此操作,並使用ALTER TABLE ...引入第一組列,與其他任何傳球相同。

下一步是查詢sysobjects和syscolumns中的元數據以確定哪些列不在那裏,並將它們與ALTER TABLE ...一起添加。

第三步是讀取標題行並使用它來構建SQL語句。使用@ _1,@ _2作爲參數名稱,以避免在最後一步中記住名稱。

最後,遍歷剩餘的行。對於每一行,將單元格綁定到相應的參數表,然後執行語句。

0

首先,非常感謝你的回覆!

讓我看看,如果我得到你說的話:

如果有列ABCD Sheet1中,當我運行的代碼,我將擁有一個具有列ABCD

那麼如果我SQL表有一個具有列ABCDE另一張紙,我將做到以下幾點:

步驟0:把我現有的表中的所有列名(在這種情況下ABCD)

第1步:讀取Excel工作表的標題行(ABCDE)

步驟2-)相比)步0和步1 步驟的結果2 - b獲取從我的SQL表中缺少的列名和它們在這種情況下,E列添加到它(
)等等將它添加到表後,我的SQL表將有 列ABCDE

,但我不明白當u下面說你的意思:

# 第三步是讀標題行和使用它構建SQL語句。使用@ _1,@ _2作爲參數名稱,以避免在最後一步中記住名稱。

最後,迭代剩餘的行。對於每一行,將單元格綁定到相應的參數表,然後執行語句。 # 再次我真的很感謝你的幫助:) :)

相關問題