通过C#使Excel数据导入数据库
通过C#使Excel数据导入数据库,需要用到微软Office的驱动引擎,这个有两个可供选择:
Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。
Jet 引擎大家都很熟悉,可以访问 Office 97-2003,但不能访问 Office 2007。
ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。
另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。
下面给出一个C#实例:
private void TransferData(string excelFileName, string sheetName, string connectionString)
{
DataSet ds = new DataSet();
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + excelFileName + ";" + "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
OleDbConnection conn = new OleDbConnection(strConn);
try
{
conn.Open();
string strExcel = string.Format("select * from [{0}$]", sheetName);
OleDbDataAdapter da = new OleDbDataAdapter(strExcel, conn);
da.Fill(ds, sheetName);
//用bcp导入数据
using (SqlBulkCopy bcp = new SqlBulkCopy(connectionString))
{
bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize = 100;//每次传输的行数
bcp.NotifyAfter = 100;//每次提示的行数
bcp.DestinationTableName = sheetName;//目标表
bcp.WriteToServer(ds.Tables[0]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}
//进度显示
void bcp_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
this.Text = e.RowsCopied.ToString();
this.Update();
}
private void button1_Click(object sender, EventArgs e)
{
string connString = "server=.\\SQLEXPRESS;database=db_test;uid=sa;pwd=123456";
TransferData("d:\\test1.xlsx", "Sheet1", connString);
}
{
DataSet ds = new DataSet();
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + excelFileName + ";" + "Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
OleDbConnection conn = new OleDbConnection(strConn);
try
{
conn.Open();
string strExcel = string.Format("select * from [{0}$]", sheetName);
OleDbDataAdapter da = new OleDbDataAdapter(strExcel, conn);
da.Fill(ds, sheetName);
//用bcp导入数据
using (SqlBulkCopy bcp = new SqlBulkCopy(connectionString))
{
bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize = 100;//每次传输的行数
bcp.NotifyAfter = 100;//每次提示的行数
bcp.DestinationTableName = sheetName;//目标表
bcp.WriteToServer(ds.Tables[0]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}
//进度显示
void bcp_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
this.Text = e.RowsCopied.ToString();
this.Update();
}
private void button1_Click(object sender, EventArgs e)
{
string connString = "server=.\\SQLEXPRESS;database=db_test;uid=sa;pwd=123456";
TransferData("d:\\test1.xlsx", "Sheet1", connString);
}
最后,对于两个参数的解释,
参数HDR的值:
HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
IMEX ( IMport EXport mode )设置
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。