多个不同的Excel工作表到一个SQL表中

时间:2010-10-19 10:46:52

标签: c# asp.net ado.net

我有很多excel表,哪些列略有不同,我想将所有这些表(一次一个)导入到一个SQL TABLE中。我举个例子:

说ive编写了所需的程序并称之为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.

我应该得到以下UPdATED db表:

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

我应该得到以下数据库表:

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();
    }

}

我写的代码再次不是我想要的,请你帮我修改它以获得我想要的代码!

提前谢谢你:)

2 个答案:

答案 0 :(得分:0)

首先,如果您创建一个包含例如RowID列的最小表,您将使自己的生活变得更轻松。这样,您可以避免必须在第一次传递时创建表的边缘情况。或者,您可以在第一次传递时执行此操作,并使用ALTER TABLE ...引入第一组列,与任何其他传递相同。

下一步是查询sysobjects和syscolumns中的元数据以确定哪些列不存在,并使用ALTER TABLE ...添加它们。

第三步是读取标题行并使用它来构建SQL语句。使用@ _1,@ _2作为参数名称,以避免在最后一步中记住名称。

最后,迭代剩余的行。对于每一行,将单元格绑定到相应的参数,然后执行语句。

答案 1 :(得分:0)

首先,非常感谢您的回复!

让我看看你是否得到了你说的话:

如果sheet1具有列A B C D,当我运行代码时,我将有一个包含A B C D列的SQL表

然后,如果我有另一张包含A B C D E列的表格,我将执行以下操作:

步骤0:获取现有表的所有列名称(在本例中为A B C D)

步骤1:从Excel工作表中读取标题行(A B C D E)

步骤2-a)比较步骤0和步骤1的结果 步骤2- b)获取我的sql表中缺少的列名并将其添加到其中(
           在这种情况下,列E)所以在将它添加到表后,我的sql表将有            列A B C D E

但是当你说下面的内容时,我并不明白你的意思:

# 第三步是读取标题行并使用它来构建SQL语句。使用@ _1,@ _2作为参数名称,以避免在最后一步中记住名称。

最后,迭代剩余的行。对于每一行,将单元格绑定到相应的参数,然后执行该语句。 # 再次,我真的很感谢你的帮助:):))