如何导入不规则Excel数据(比如单元格的合并,导入到sql数据库中,那么只有相关信息的第一行才显示数据,其他几行都空白)。
首先:先按正常导入方式导入。
2、在数据库里更新(比如单元格的合并产生的问题填充)
3、转换日期格式(如日期填充天数为3-8,6-15,8-20)
********************************************************************************************************
1、如何导入Excel数据
/// <summary>
/// //先把它的文件上传到服务器来,然后再导入到你的数据库,这样就没有权限的问题了
/// </summary>
/// <param name="FileSource"></param>
/// <param name="StyleSheet"></param>
//string fileName=Server.MapPath("")+"//upload"+"//test.xls";
//myFile.PostedFile.SaveAs(fileName);
public void LoadData(string FileSource,string StyleSheet)
{
string strCon ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + @FileSource + ";Extended Properties=Excel 8.0";
OleDbConnection myConn = new OleDbConnection(strCon);
myConn.Open(); //打开数据链接,得到一个数据集
DataSet myDataSet = new DataSet(); //得到自己的DataSet对象
string StrSql="select * from ["+StyleSheet+"$]";
OleDbDataAdapter myCommand = new OleDbDataAdapter(StrSql,myConn); //创建一个 DataSet对象
myCommand.Fill(myDataSet,"["+StyleSheet+"$]");
myCommand.Dispose();
DataTable DT=myDataSet.Tables["["+StyleSheet+"$]"];
myConn.Close();
myCommand.Dispose();
conn.Close();
conn.Open();
string sql="delete from TEST";
SqlCommand comm=new SqlCommand(sql,conn);
comm.ExecuteNonQuery();
comm.Dispose();
try
{
for(int j=1;j<DT.Rows.Count;j++)
{
string ID=DT.Rows[j][0].ToString();
if (ID =="")
{
}
else
{
string AUTHOR=DT.Rows[j][1].ToString();
string NAME=DT.Rows[j][2].ToString();
string PRICE=DT.Rows[j][3].ToString();
string strSql="insert into TEST(ID,AUTHOR,NAME,PRICE) ";
strSql=strSql + "values('"+ID+"','"+AUTHOR+"','"+NAME+"','"+PRICE+"')";
comm=new SqlCommand(strSql,conn);
comm.ExecuteNonQuery();
if (j==DT.Rows.Count-1)
{
Label1.Visible=true;
}
}
}
conn.Close();
}
catch(Exception exc)
{
conn.Close();
string s = exc.ToString();
return;
}
}
调用
private void Button1_Click(object sender, System.EventArgs e)
{
string a="d:/x.xls";
string b="Sheet1";
LoadData(a,b);
}
**************************************************************************************
2、转换合并单元格引起的字段内容空白问题,如“author”作者列是部分空白。
private void Button2_Click(object sender, System.EventArgs e)
{
try
{
conn.Open();
string SQL="Select ID,(Case When IsNull(AUTHOR, '') = '' Then (Select TOP 1 AUTHOR From Test Where ID < A.ID And IsNull(AUTHOR, '') != '' Order By ID Desc) Else AUTHOR End) As AUTHOR, NAME,PRICE From Test A";
DataTable dt=Connect.BindTable(SQL);
if(dt.Rows.Count != 0)
{
string sql="Update A Set AUTHOR = (Select TOP 1 AUTHOR From Test Where ID < A.ID And IsNull(AUTHOR, '') != '' Order By ID Desc) From Test A where IsNull(AUTHOR, '') = ''";
SqlCommand myCmd=new SqlCommand(sql,conn);
myCmd.ExecuteNonQuery();
}
conn.Close();
}
catch(Exception exc)
{
conn.Close();
string s = exc.ToString();
return;
}
}
**********************************************************************************************
3、转换日期格式,并插入新表保留完整数据(如日期填充天数为3-8,6-15,8-20)
try
{
conn.Close();
conn.Open();
string sql="delete from NEW"; //先删除NEW数据表中的数据,然后再插入,实际操作的时候可以限制条件,比如年份,月份等.
SqlCommand comm=new SqlCommand(sql,conn);
comm.ExecuteNonQuery();
comm.Dispose();
DataTable dt=Connect.BindTable( "select * from test order by ID");
if(dt.Rows.Count != 0)
{
for(int i=0;i< dt.Rows.Count;i++)
{
string ID=dt.Rows[i][0].ToString();
string AUTHOR=dt.Rows[i][1].ToString();
string NAME=dt.Rows[i][2].ToString();
string PRICE=dt.Rows[i][3].ToString();
string[] mystr=NAME.Split('-');
int a=int.Parse(mystr[0]);
int b=int.Parse(mystr[1]);
for(int j=a;j<=b;j++)
{
string strSql="insert into NEW(ID,AUTHOR,NAME,PRICE) ";
string x=this.DropDownList1.SelectedValue+"-"+this.DropDownList2.SelectedValue+"-" + j.ToString();
strSql=strSql + "values('"+ID+"','"+AUTHOR+"','"+x+"','"+PRICE+"')";
comm=new SqlCommand(strSql,conn);
comm.ExecuteNonQuery();
}
}
conn.Close();
}
}
catch(Exception exc)
{
conn.Close();
string s = exc.ToString();
return;
}
*****************************************************************************************************************
导入结束。