usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.OleDb;namespaceExcelToSQL
{public partial classForm1 : Form
{publicForm1()
{
InitializeComponent();
}private void button1_Click(objectsender, EventArgs e)
{//测试,将excel中的student导入到sqlserver的db_test中,如果sql中的数据表不存在则创建
string connString = "server = (local); uid = sa; pwd = sa; database = db_test";
System.Windows.Forms.OpenFileDialog fd= newOpenFileDialog();if (fd.ShowDialog() ==DialogResult.OK)
{
TransferData(fd.FileName,"student", connString);
}
}public void TransferData(string excelFile, string sheetName, stringconnectionString)
{
DataSet ds= newDataSet();try{//获取全部数据
string strConn = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties = Excel 8.0;";
OleDbConnection conn= newOleDbConnection(strConn);
conn.Open();string strExcel = "";
OleDbDataAdapter myCommand= null;
strExcel= string.Format("select * from [{0}$]", sheetName);
myCommand= newOleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, sheetName);//如果目标表不存在则创建,excel文件的第一行为列标题,从第二行开始全部都是数据记录
string strSql = string.Format("if not exists(select * from sysobjects where name = '{0}') create table {0}(", sheetName); //以sheetName为表名
foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
{
strSql+= string.Format("[{0}] varchar(255),", c.ColumnName);
}
strSql= strSql.Trim(',') + ")";using (System.Data.SqlClient.SqlConnection sqlconn = newSystem.Data.SqlClient.SqlConnection(connectionString))
{
sqlconn.Open();
System.Data.SqlClient.SqlCommand command=sqlconn.CreateCommand();
command.CommandText=strSql;
command.ExecuteNonQuery();
sqlconn.Close();
}//用bcp导入数据//excel文件中列的顺序必须和数据表的列顺序一致,因为数据导入时,是从excel文件的第二行数据开始,不管数据表的结构是什么样的,反正就是第一列的数据会插入到数据表的第一列字段中,第二列的数据插入到数据表的第二列字段中,以此类推,它本身不会去判断要插入的数据是对应数据表中哪一个字段的
using (System.Data.SqlClient.SqlBulkCopy bcp = newSystem.Data.SqlClient.SqlBulkCopy(connectionString))
{
bcp.SqlRowsCopied+= newSystem.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize= 100;//每次传输的行数
bcp.NotifyAfter = 100;//进度提示的行数
bcp.DestinationTableName = sheetName;//目标表
bcp.WriteToServer(ds.Tables[0]);
}
}catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}//进度显示
void bcp_SqlRowsCopied(objectsender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
{this.Text =e.RowsCopied.ToString();this.Update();
}
}
}