提供把Excel里的数据导入到SQL Server 数据库,前提是Excel里的字段在Sql Server表里都有,不然会出现错误。注释很详细哦!要引用的命名空间是:
using System.Data.OleDb;
using System.Data.SqlClient;
Code
publicclassExcelToSQL
{
//stringSqlConnectionString="Server=(local);InitialCatalog=Test;IntegratedSecurity=True";
publicSqlConnectionsqlcon;//创建SQL连接
publicSqlCommandsqlcom;//创建SQL命令对象
publicExcelToSQL()
{
DataOperationdataOperation=newDataOperation();//用到平台的函数,就是初始化SqlConnection对象
DBUnitdbUnit=dataOperation.GetDbUnit();
sqlcon=(SqlConnection)t;
if(sqlcon.State.ToString()=="Open")
sqlcon.Close();
}
publicintImportSql(stringexcelPath,stringtableName)//导入的Excel的路径,数据库里的表名
{
if(!TableExist(tableName))//表名是否存在
return(int)ImportState.tableNameError;
DataTabledt=ExcelToDataTable(excelPath);
if (dt == null)
{
return (int)ImportState.excelFormatError;
}
ArrayListtableField=GetTableField(tableName);//表格的列名称
stringcolumnName="ID,";//Excel里的列名,增加一个ID列
for(inti=0;i<dt.Columns.Count;i++)
{
columnName+=dt.Columns[i].ColumnName+",";
stringcurrentColumn=dt.Columns[i].ToString().ToUpper();//当前列名
for(intj=0;j<tableField.Count;j++)
{
if(tableField[j].ToString().ToUpper()==dt.Columns[i].ToString().ToUpper())
break;//跳出本层和上一层循环,continue是跳出本层循环,如果用continue,会继续执行j++
//Excel里的字段必须在Sql中都有
if((tableField[j].ToString().ToUpper()!=dt.Columns[i].ToString().ToUpper())&&j==tableField.Count-1)
return(int)ImportState.fieldMatchError;
}
}
intm=columnName.LastIndexOf(',');
columnName=columnName.Remove(m);//移除最后一个逗号
sqlcom=newSqlCommand();
sqlcom.Connection=sqlcon;
sqlcon.Open();
mandType=CommandType.Text;
for(inth=0;h<dt.Rows.Count;h++)
{
stringvalue="'"+System.Guid.NewGuid().ToString()+"'"+",";
for(intk=0;k<dt.Columns.Count;k++)//根据列名得到值
{
value+="'"+dt.Rows[h][k].ToString()+"'"+",";
}
value=value.Remove(0,1);
intn=value.LastIndexOf(',');
value=value.Remove(n);//移除最后一个逗号
n=value.LastIndexOf("'");
value=value.Remove(n);
try
{
stringsql="insertinto"+tableName+"("+columnName+")values('"+value+"')";
mandText=sql;
stringsss=sqlcom.ExecuteNonQuery().ToString();
}
catch(Exceptionerr)
{
stringerroe=err.Message;
return(int)ImportState.dataTypeError;
}
}
sqlcon.Close();
sqlcom.Dispose();
return(int)ImportState.right;
}
publicDataTableExcelToDataTable(stringexcelPath)//把Excel里的数据转换为DataTable,并返回DataTable
{
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelPath + ";Extended Properties='Excel 8.0;IMEX=1'";
System.Data.OleDb.OleDbConnection Conn = new System.Data.OleDb.OleDbConnection(strCon);
string strCom = "SELECT * FROM [Sheet1$]";
DataTable dt;
try
{
Conn.Open();
System.Data.OleDb.OleDbDataAdapter myCommand = new System.Data.OleDb.OleDbDataAdapter(strCom, Conn);
DataSet ds = new DataSet();
myCommand.Fill(ds, "[Sheet1$]");
Conn.Close();
dt = ds.Tables[0];
}
catch(Exception err)
{
return null;
}
return dt;
}
publicboolTableExist(stringtableName)//查看数据库里是否有此表名
{
sqlcom=newSqlCommand();
sqlcom.Connection=sqlcon;
mandType=CommandType.Text;
try
{
sqlcon.Open();
stringsql="selectnamefromsysobjectswheretype='u'";
mandText=sql;
SqlDataReadersqldr=sqlcom.ExecuteReader();
while(sqldr.Read())
{
if(sqldr.GetString(0).ToUpper()==tableName.ToUpper())
returntrue;
}
}
catch{returnfalse;}
finally
{
sqlcon.Close();
}
returnfalse;
}
publicArrayListGetTableField(stringtableName)//得到数据库某一个表中的所有字段
{
ArrayListal=newArrayList();
sqlcom=newSqlCommand();
sqlcom.Connection=sqlcon;
mandType=CommandType.Text;
try
{
sqlcon.Open();
stringsql="SELECTb.nameFROMsysobjectsaINNERJOINsyscolumnsbONa.id=b.idWHERE(a.name='"+tableName+"')";
mandText=sql;
SqlDataReadersqldr=sqlcom.ExecuteReader();
while(sqldr.Read())
{
al.Add(sqldr.GetString(0));
}
}
finally
{
sqlcon.Close();
}
returnal;//返回的是表中的字段
}
publicenumImportState
{
right=1,//成功
tableNameError=2,//表名不存在
fieldMatchError=3,//excel里的字段和数据库表里的字段不匹配
dataTypeError=4,//转换数据类型时发生错误
excelFormatError=5,//Excel格式不能读取
}
publicvoidAlert(stringstr)
{
HttpContext.Current.Response.Write("<scriptlanguage='javascript'>alert('"+str+"');</script>");
}
}
页面调用代码:
Code
protectedvoidbtnExport_Click(objectsender,EventArgse)
{
stringfilepath=this.fileUpload.PostedFile.FileName;
if(filepath!="")
{
if(this.txtTableName.Text!="")
{
if(filepath.Contains("xls"))
{
intresult=ets.ImportSql(filepath,this.txtTableName.Text);
if(result==(int)ExcelToSQL.ImportState.tableNameError)
ets.Alert("此表名在数据中不存在!");
else if(result==(int)ExcelToSQL.ImportState.excelFormatError)
ets.Alert("Excel格式不能正确读取!");
elseif(result==(int)ExcelToSQL.ImportState.fieldMatchError)
ets.Alert("Excel里的字段和SqlServer里的字段不匹配!");
elseif(result==(int)ExcelToSQL.ImportState.dataTypeError)
ets.Alert("转换数据类型时发生错误!");
elseif(result==(int)ExcelToSQL.ImportState.right)
{
ets.Alert("导入成功");
}
}
elseets.Alert("上传的文件类型必须为excel文件!");
}
elseets.Alert("表名不能为空!");
}
elseets.Alert("没有选择要上传的文件!");
}
前台代码:
Code
<formid="form1"runat="server">
<div>
<asp:LabelID="Label1"runat="server"Text="路径"></asp:Label>
<asp:FileUploadID="fileUpload"runat="server"Width="443px"/><br/>
<asp:LabelID="Label2"runat="server"Text="数据库表名称"></asp:Label>
<asp:TextBoxID="txtTableName"runat="server"></asp:TextBox><br/>
<asp:ButtonID="btnExport"runat="server"Text="导入到SQL"OnClick="btnExport_Click"/>
</div>
</form>