实现Excel数据导入到SQL2005中的方法
一、
在程序中,用ADO.NET。代码如下:
//连接串
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + [EXCEL文件,含路径] + ";";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
DataTable dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[] {null, null, null, "TABLE"});
DataSet ds = new DataSet();
//一个EXCEL文件可能有多个工作表,遍历之
foreach( DataRow dr in dtSchema.Rows )
{
string table = dr["TABLE_NAME"].ToString();
string strExcel = "SELECT * FROM [" + table + "]";
ds.Tables.Add(table);
OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel,conn);
myCommand.Fill(ds,table);
}
conn.Close();
这样,读取出来的数据就藏在DataSet里了。
采用这种方式,数据库所在机器不必装有EXCEL。
二、
在查询分析器里,直接写SQL语句:
如果是导入数据到现有表,则采用
INSERT INTO 表 SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
的形式
如果是导入数据并新增表,则采用
SELECT * INTO 表 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
的形式。
以上语句是将EXCEL文件里SHEET1工作表中所有的列都读进来,如果只想导部分列,可以
INSERT INTO 表(a1,a2,a3) SELECT a1,a2,a3 FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)
其实可以将OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)当成一个表,例如我就写过这样一个句子:
INSERT INTO eval_channel_employee(channel,employee_id)
SELECT CASE a.渠道 WHEN 'DIY' THEN 1 WHEN 'RDC' THEN 0 WHEN 'KCM' THEN 2 ELSE 3 END
,b.id FROM
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;DATABASE=c:\temp\name.xls',sheet1$) AS a,pers_employee b
WHERE a.员工编码=b.code
不管是哪种方式,哪种途径,系统都会默认将第一行上的内容作为字段名。
这二种方式虽然非常好,但操作过程不太方便,经过测试发现在SQL2005中直接可以实现导入功能。操作过程如下:
第一步:登录到SQL Server Management Studio,
第二步:在“对象资源管理器”中右键单击“管理”,在弹出列表中单击“导入数据”
第三步:在“导入向导”对话框中单击“下一步”,进入到“选择数据源”对话框,在“数据源”列表中选择“Microsoft Excel ”,同时选择相应的Excel 文档,完成后单击“下一步”(一定要勾选该对话框中的“首行包含列名称”,因此它是将Excel文档中的列标题为数据库表中的列项标题)
第四步:指定目标数据库服务,依次单击“下一步”。。。。至到“完成”
第五步:重新打到SQL Server Management Studio,进入到导入的数据库表,可以发现所导入的Excel文档数据。
public DataSet ExecleDs(string filenameurl,string table)
2 {
3 string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +filenameurl+ ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
4 OleDbConnection conn = new OleDbConnection(strConn);
5
6 OleDbDataAdapter odda = new OleDbDataAdapter("select * from [Sheet1$]",conn);
7 DataSet ds = new DataSet();
8 odda.Fill(ds,table);
9
10 return ds;
11
12 }
13 然后设计页面,在此作个简单的页面
<table style="width: 395px; height: 84px" border="1">2
<tr>3
<td style="width:380px" align="center">4
批量导入用户信息</td>5
</tr>6
<tr>7
<td style="width: 100px">8
<asp:FileUpload ID="FileUpload1" runat="server" Width="380px" /></td>9
</tr>10
<tr>11
<td style="width:380px" align="center">12
<asp:Button ID="Button1" runat="server" Text="添加" OnClick="Button1_Click" /></td>13
</tr>14
</table>15
<asp:Label ID="Label1" runat="server" Width="466px"></asp:Label>
当点击添加按钮时激发事件,代码如下
protected void Button1_Click(object sender, EventArgs e)2
{3
if (FileUpload1.HasFile == false)4
{5
Response.Write("<script>alert('请您选择Excel文件')</script> ");6
return;//当无文件时,返回7
}8
string IsXls=System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();9
if (IsXls != ".xls")10
{11
Response.Write("<script>alert('只可以选择Excel文件')</script>");12
return;//当选择的不是Excel文件时,返回13
}14
string error = null;15
Access.Class1 ac = new Access.Class1();16
SqlConnection cn = ac.myConnection();17
cn.Open();18
string strpath = FileUpload1.PostedFile.FileName.ToString(); //获取Execle文件路径19
string filename = FileUpload1.FileName; //获取Execle文件名20
DataSet ds = ac.ExecleDs(strpath,filename);21
DataRow[] dr = ds.Tables[0].Select(); //定义一个DataRow数组22
int rowsnum = ds.Tables[0].Rows.Count;23
if (rowsnum == 0) 24
{25
Response.Write("<script>alert('Excel表为空表,无数据!')</script>"); //当Excel表为空时,对用户进行提示26
}27
else28
{29
for (int i = 0; i < dr.Length; i++)30
{31
string YHMC = dr[i]["YongHuMingCheng"].ToString();32
string YHMM = dr[i]["YongHuMiMa"].ToString();33
string DQRQ = dr[i]["DaoQiRiQi"].ToString();34
string ZT = dr[i]["ZhuangTai"].ToString();35
string TJSJ = dr[i]["TianJiaShiJian"].ToString();36
string JXDM = dr[i]["JiaXiaoDaiMa"].ToString();37

38
string sqlcheck = "select count(*) from DC_YongHuLieBiao where YongHuMingCheng='" + YHMC + "'And JiaXiaoDaiMa='" + JXDM + "'"; //检查用户是否存在39
bool ch = ac.check(sqlcheck); 40
if (ch == true)41
{42
string insertstr = "insert into DC_YongHuLieBiao(YongHuMingCheng,YongHuMiMa,DaoQiRiQi,ZhuangTai,TianJiaShiJian,JiaXiaoDaiMa) values('" +43
YHMC + "','" + YHMM + "','" + DQRQ + "','" + ZT + "','" + TJSJ + "','" + JXDM + "')";44

45
SqlCommand cmd = new SqlCommand(insertstr,cn);46
try47
{48
cmd.ExecuteNonQuery();49
}50
catch (MembershipCreateUserException ex) //捕捉异常51
{52
Response.Write("<script>alert('创建用户:"+ex.Message+"')</script>");53
}54

55
}56
else57
{58
error += "<em style='color:red;font-sixe:25px'>"+YHMC+"</em>用户已存在,此行记录无法插入!请修改用户再进行插入 <br>"; //若用户存在,将已存在用户信息打出,并提示此用户无法插入59
continue;60
}61

62
63

64
}65

66
Response.Write("<script>alert('Excle表导入成功!')</script>");67
Label1.Text = error;68
}69

70
cn.Close();71
72
}73


浙公网安备 33010602011771号