一:Excel導入數據到數據庫
最開始是在網上搜到了一段代碼,大致的思路是這樣的:先獲得Excel文件以及其路徑,然后調用一個自定義的方法將表內的內容填充到DataSet對象中,接著就讀取DataSet對象中的每一行與每一列分別賦給數據庫的各個字段最后調用SQL語句插入。但是由于這個項目使用三層架構開發(fā)的,很多數據庫的字段都被封裝好了,在自己定義的類內無法訪問(初次接觸三層架構,或許是因為自己還不知道訪問的方法)后來就一直卡在這兒了,后來問了彭威學長,他建議我換一種導入的方法,然后將他以前寫的導入的類拿過來給我參考,不過是C/S類型的而且是沒有注釋。后來整整花了我一個晚上的時間才將他的代碼整理成我們可以用的。代碼如下:
using System;
using System.Data;
using System.IO;
using System.Configuration;
using System.Web;
using System.Data.OleDb;
using System.Threading;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
namespace Basketball.Web
{
public class To_data
{
protected Thread Leading;//定義一個線程
private DataSet dsforloading = new DataSet();//聲明一個DataSet對象
private int GetSheetIndex(byte[] FindTarget, byte[] FindItem)//獲取表的索引
{
int index = -1;
int FindItemLength = FindItem.Length;
if (FindItemLength < 1) return -1;
int FindTargetLength = FindTarget.Length;
if ((FindTargetLength - 1) < FindItemLength) return -1;
for (int i = FindTargetLength - FindItemLength - 1; i > -1; i--)
{
System.Collections.ArrayList tmpList = new System.Collections.ArrayList();
int find = 0;
for (int j = 0; j < FindItemLength; j++)
{
if (FindTarget[i + j] == FindItem[j]) find += 1;
}
if (find == FindItemLength)
{
index = i;
break;
}
}
return index;
}
//獲得excel表的名稱(一個Excel文件里面或許有多張表)
private string GetSheetName(string filePath)
{
string sheetName = "";
try
{
FileStream tmpStream = File.OpenRead(filePath);//打開并讀取Excel文件
byte[] fileByte = new byte[tmpStream.Length];
tmpStream.Read(fileByte, 0, fileByte.Length);//以Byte的形式讀取文件
tmpStream.Close();
byte[] tmpByte = new byte[]{Convert.ToByte(11),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),
Convert.ToByte(11),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),Convert.ToByte(0),
Convert.ToByte(30),Convert.ToByte(16),Convert.ToByte(0),Convert.ToByte(0)};
int index = GetSheetIndex(fileByte, tmpByte);//獲得表的索引
if (index > -1)
{
index += 16 + 12;
System.Collections.ArrayList sheetNameList = new System.Collections.ArrayList();
for (int i = index; i < fileByte.Length - 1; i++)
{
byte temp = fileByte[i];
if (temp != Convert.ToByte(0))
sheetNameList.Add(temp);//添加到表名
else
break;
}
byte[] sheetNameByte = new byte[sheetNameList.Count];
for (int i = 0; i < sheetNameList.Count; i++)
sheetNameByte[i] = Convert.ToByte(sheetNameList[i]);
sheetName = System.Text.Encoding.Default.GetString(sheetNameByte);
}
}
catch (Exception e)
{
throw e;
}
return sheetName;
}
private void TransferData(string excelFile, string sheetName, string tablename, string connectionString)
{
try
{
//獲取全部數據
string strConn = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;", excelFile);//建立連接Excel文件的字符串
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;//聲明讀取Excel文件的對象并初始化
strExcel = String.Format("select * from [{0}$]", sheetName);//建立讀取內容的字符串
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(dsforloading, sheetName);//調用讀取Excel文件對象的Fill方法將表內容填充到DataSet對象中去,Excel中的數據自此就都進入了DataSet對象中
string filter = dsforloading.Tables[0].Columns[1].ColumnName + " IS NOT NULL";//過濾不符合要求的內容
DataTable dt = dsforloading.Tables[0].Clone();//將DataSet對象中克隆到DataTable對象
foreach (DataRow dr in dsforloading.Tables[0].Select(filter))
{
dt.ImportRow(dr);//完成數據的復制
}
//用bcp導入數據
using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))//實現數據的批量輸入
{
bcp.BatchSize = 100;//每次傳輸的行數
bcp.NotifyAfter = 100;//進度提示的行數
bcp.DestinationTableName = tablename;//目標表
bcp.WriteToServer(dt);//完成復制
}
// MessageBox.Show("導入成功!");
}
catch (Exception ex)
{
throw ex;//拋出異常在頁面后臺代碼中捕獲
}
finally
{
Leading.Abort();//終止線程
}
}
protected void LoadDataToSql(string tablename,string path)//參數為數據庫表名以及Excel文件名稱
{//將Excel文件的內容導入數據庫函數,到時在頁面后天代碼中只用調用該函數即可
TransferData(path, GetSheetName(path), tablename, ConfigurationManager.AppSettings["ConnectionString"]);//最后一個參數為數據庫連接的字符串,數據庫連接實在Web.Config文件中配置的
}
}
}
體會:花了一天半的時間才完成公共類的一個函數,并且還累的要命?;蛟S對于初次做項目的人來說就是這么難吧!很多技術都不知道,當出現了bug的時候有時得花幾個小時甚至幾天來調試。最近明顯感覺睡眠質量提升了,或許就是每天大負荷量的腦力勞動吧!沒辦法,這就是程序員的生活,誰叫自己從事的是這個行業(yè)呢!總之加油吧!
我選擇我喜歡~~~
聯(lián)系客服