讀取Execl表 導入數據庫
不知不覺博客園園林都兩年多了,我是今年畢業的應屆生,最近公司項目需要改動,很多的數據需要導入,很多的實體類需要些。考慮到這些問題自己寫了兩個winform版的小工具,一個是讀取Execl數據導入數據庫,另一個是自動生成實體類,以及增,刪,改的方法。今天先分享Execl數據導入數據庫。基本上沒什麽界面就兩個按鈕而已。一個是選擇導入的文件,一個是導入數據庫按鈕。
首先我寫了一個MSSQLAction的類,取數據的類,相當於三層裏面的SqlHelper類,裏面有兩個方法
一個是準備讀取數據前的命令配置
public static void PrepareCommand(SqlConnection conn, SqlCommand cmd, SqlTransaction trans, CommandType cmdType, string cmdText, params SqlParameter[] value)
{
try
{
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
cmd.Connection = conn;
if (trans != null)
{
cmd.Transaction = trans;
}
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
if (value != null)
{
foreach (SqlParameter item in value)
{
cmd.Parameters.Add(item);
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
另一個就是操作增,刪,改的方法
public static int ExecuteNonQuery(string connString, CommandType cmdTyep, string cmdText, params SqlParameter[] value)
{
using (SqlConnection conn = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand();
PrepareCommand(conn, cmd, null, cmdTyep, cmdText, value);
int result = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return result;
}
}
取數據的類寫好了,現在寫Form的後臺,一個四個方法:
一個是選擇文件的事件,filepath 是一個全局變量
private void File_Click(object sender, EventArgs e)
{
OpenFileDialog file = new OpenFileDialog();
file.ShowDialog();
filepath = file.FileName;
label1.Text = file.FileName;
}
一個是獲取Execl數據的方法
public List<System.Data.DataTable> GetExcelDatatable(string fileUrl)
{
const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties=‘Excel 12.0; HDR=Yes; IMEX=1‘";
//建立連接
OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl));
try
{
//打開連接
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
List<System.Data.DataTable> list = new List<DataTable>();
System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
//獲取Excel的第一個Sheet名稱
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
System.Data.DataTable dt = new DataTable();
string sheetName = schemaTable.Rows[i]["TABLE_NAME"].ToString().Trim();
string strSql = "select * from [" + sheetName + "]";
OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
DataSet ds = new DataSet();
da.Fill(ds);
dt = ds.Tables[0];
list.Add(dt);
}
return list;
}
catch (Exception exc)
{
throw exc;
}
finally
{
conn.Close();
conn.Dispose();
}
}
一個是往數據庫插入數據的方法
public int InsetData(System.Data.DataTable dt)
{
int i = 0;
foreach (DataRow dr in dt.Rows)
{
string findDate = dr[0].ToString().Trim() == "" ? null :
Convert.ToDateTime(dr[0].ToString().Trim()).ToShortDateString().ToString();
string date = Convert.ToDateTime(findDate).ToString("s");
string resultDate = date.Substring(0, 10);
string brand = dr[1].ToString().Trim() == "" ? null : dr[1].ToString().Trim();
string storeName = dr[2].ToString().Trim() == "" ? null : dr[2].ToString().Trim();
string type = storeName.Substring(0, 2);
string city = dr[3].ToString().Trim() == "" ? null : dr[3].ToString().Trim();
string throughTrain = dr[4].ToString().Trim() == "" ? "0" : dr[4].ToString().Trim();
string showNumber = dr[5].ToString().Trim() == "" ? "0" : dr[5].ToString().Trim();
string payNumber = dr[6].ToString().Trim() == "" ? "0" : dr[6].ToString().Trim();
string freeNumber = dr[7].ToString().Trim() == "" ? "0" : dr[7].ToString().Trim();
string drillShow = dr[8].ToString().Trim() == "" ? "0" : dr[8].ToString().Trim();
string visitorsNumber = dr[9].ToString().Trim() == "" ? "0" : dr[9].ToString().Trim();
string commission = dr[10].ToString().Trim() == "" ? "0" : dr[10].ToString().Trim();
string activity = dr[11].ToString().Trim() == "" ? "0" : dr[11].ToString().Trim();
string other = dr[12].ToString().Trim() == "" ? "0" : dr[12].ToString().Trim();
string strConnection = "server=.;database=tests;Integrated Security=True";
string strSql = "Insert into LemonFlagshipStore(Lemon1,Lemon2,Lemon3,Lemon4,Lemon5,Lemon6,Lemon7,Lemon8,Lemon9,Lemon10,Lemon11,Lemon12,Lemon13,Lemon14) Values (‘" + brand + "‘,‘" + city + "‘,‘" + resultDate + "‘,‘" + storeName + "‘,‘" + commission + "‘,‘" + activity + "‘,‘" +
throughTrain + "‘,‘" + drillShow + "‘,‘" + other + "‘,‘" + freeNumber + "‘,‘" +
payNumber + "‘,‘" + showNumber + "‘,‘" + visitorsNumber + "‘,‘" + type + "‘)";
int result = MSSQLAction.ExecuteNonQuery(strConnection, CommandType.Text, strSql);
i++;
}
return i;
}
最後就是一個簡單點擊導入數據的事件
private void Import_Click(object sender, EventArgs e)
{
try
{
List<System.Data.DataTable> table = this.GetExcelDatatable(filepath);
int listCount = 0;
foreach (System.Data.DataTable dt in table)
{
int result = this.InsetData(dt);
listCount += result;
}
MessageBox.Show("一共導入" + listCount + "數據", "導入成功");
}
catch (Exception ex)
{
MessageBox.Show("導入失敗\r\n" + "失敗原因為:\r\n" + ex, "提示");
}
}
基本的代碼實現就這麽多,當然插入要使用此代碼的話自己要把數據庫鏈接和字符串和sql的表明字段改了。做完之後是不是覺得很簡單,呵呵.....
另一個改天分享。如若需要源碼:QQ 2212907254
讀取Execl表 導入數據庫