您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)利用C# 怎么將Excel數(shù)據(jù)讀取到SQL server中,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
先上讀取Excel文件的code如下。
public bool GetFiles(string equipName) { //choose all sheet? or all data in sheet? string strExcel = "select * from [Sheet1$]"; //初始化system.IO的配置(路徑) DirectoryInfo directoryInfo1 = new DirectoryInfo(WPath + equipName + "\\Working"); //用文件流來(lái)獲取文件夾中所有文件,存放到 FileInfo[] files1 = directoryInfo1.GetFiles(); foreach (FileInfo file in files1) // Directory.GetFiles(srcFolder) { // 連接到excel 數(shù)據(jù)源, xlsx要用ACE string strConn = ("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source= " + file.FullName + "; Extended Properties='Excel 12.0';"); OleDbConnection OledbConn = new OleDbConnection(strConn); if (IsUsed(file.FullName)) { flag = IsUsed(file.FullName); continue; } try { OledbConn.Open(); // 存入datatable OleDbDataAdapter dAdapter = new OleDbDataAdapter(strExcel, strConn); //寫(xiě)入ds中的一個(gè)table dAdapter.Fill(ds); OledbConn.Dispose(); OledbConn.Close(); } catch (Exception ex) { } } }
foreach用于遍歷所有Excel文件;
strExcel用于選擇Excel文件中sheet的內(nèi)容,select * 表示選取sheet中所有行和列;
strConn用于設(shè)置讀取的方法,provider的設(shè)置很重要,ACE表示最新的.xlsx文件,jet 表示讀取.xls文件,兩者有點(diǎn)區(qū)別,DataSource表示文件名,包括路徑。
OleDbDataAdapter 用于按(命令)去執(zhí)行填充dataset的功能
dataset簡(jiǎn)而言之可以理解為 虛擬的 數(shù)據(jù)庫(kù)或是Excel文件。而dataset里的datatable 可以理解為數(shù)據(jù)庫(kù)中的table活著Excel里的sheet(Excel里面不是可以新建很多表嗎)。
這樣說(shuō)應(yīng)該很容易懂了,相當(dāng)于dataset只是暫時(shí)存放下數(shù)據(jù),微軟官方解釋是存在內(nèi)存中。至于為啥要找個(gè)“中介”來(lái)存數(shù)據(jù),這個(gè)估計(jì)是為了和SQL匹配。
好了,接下來(lái)說(shuō)下這次的重點(diǎn)。
在把Excel的數(shù)據(jù)存到dataset后,我們要把dataset的數(shù)據(jù)存入SQL才算完事。
廢話不多說(shuō)先上后面的代碼:(總的代碼)
using System.IO; using System.Data; using System.Configuration; using System.ServiceProcess; using System.Data.SqlClient; using System.Data.OleDb; using System.Timers;using System; namespace DataCollection_model_HD { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); InitTimer(); } #region 各種配置的全局定義 //定義一個(gè)dataset 用于暫時(shí)存放excel中的數(shù)據(jù),后續(xù)要存入datatable DataSet ds = new DataSet(); Timer TimModel = new Timer(); public static string LogPath = ConfigurationManager.AppSettings["LogPath"].ToString(); public static string WPath = ConfigurationManager.AppSettings["WorkingPath"].ToString(); public static string APath = ConfigurationManager.AppSettings["ArchivePath"].ToString(); //數(shù)據(jù)庫(kù)登錄 //注意Integrated Security不寫(xiě)(false)表示必須要用pwd登錄,true表示不用密碼也能進(jìn)入數(shù)據(jù)庫(kù) public static string ConnStr = ConfigurationManager.AppSettings["ConnStr"].ToString(); //用于記錄log的時(shí)候,機(jī)臺(tái)名字 public static string machineName = "test"; #endregion #region 定時(shí)器的初始化,及其事務(wù) //這個(gè)按鈕用于模擬服務(wù)(定時(shí)器)啟動(dòng) public void InitTimer() { //DFL的定時(shí)器 TimModel.Interval = 15 * 1000; //定時(shí)器的事務(wù) TimModel.Elapsed += new ElapsedEventHandler(ElapsedEventDFL); TimModel.Enabled = true; TimModel.AutoReset = true; } private void ElapsedEventDFL(object source, ElapsedEventArgs e) { if (GetFiles("test")) { //多次讀取數(shù)據(jù),存在多個(gè)文件時(shí)但其中某個(gè)文件在使用的bug ds.Tables.Clear(); Log4App.WriteLine(" ---- End the collect ! ----", LogPath, machineName, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(), Log4AES.Type.Information); } else { DataToSql("test"); BackupData("test"); Log4App.WriteLine(" ---- End the collect ! ----", LogPath, machineName, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(), Log4AES.Type.Information); } } #endregion //log初始化設(shè)置 Log4Application Log4App = new Log4Application(); /*用于移動(dòng)源文件到指定文件夾,也就是備份源數(shù)據(jù)文件 copy all file in folder Working to Achieve*/ public void BackupData(string equipName) { //需要存放(備份)的文件夾路徑(Achieve) string ArchivePath = APath + equipName + " Equipment Temp. monitoring by third tool\\Archive"; //讀取數(shù)據(jù)源文件的文件夾路徑(Working) string WorkingPath = WPath + equipName + " Equipment Temp. monitoring by third tool\\Working"; //初始化system.IO的配置(路徑) DirectoryInfo directoryInfo = new DirectoryInfo(WorkingPath); //用文件流來(lái)獲取文件夾中所有文件,存放到 FileInfo[] files = directoryInfo.GetFiles(); //循環(huán)的把所有機(jī)臺(tái)數(shù)據(jù)備份到Achieve文件夾 try { foreach (FileInfo file in files) // Directory.GetFiles(srcFolder) { //使用IO中的Moveto函數(shù)進(jìn)行移動(dòng)文件操作 file.MoveTo(Path.Combine(ArchivePath, file.Name)); } } catch (Exception ex) { } } //判斷Excel是否在被人使用 public bool IsUsed(String fileName) { bool result = false; try { FileStream fs = File.OpenWrite(fileName); fs.Close(); } catch { result = true; } return result; } //將xls文件投入datatable , 返回一個(gè)datatable為 ds.table[0] public bool GetFiles(string equipName) { bool flag = false; //choose all sheet? or all data in sheet? string strExcel = "select * from [Sheet1$]"; //初始化system.IO的配置(路徑) DirectoryInfo directoryInfo1 = new DirectoryInfo(WPath + equipName + " Equipment Temp. monitoring by third tool\\Working"); //用文件流來(lái)獲取文件夾中所有文件,存放到 FileInfo[] files1 = directoryInfo1.GetFiles(); foreach (FileInfo file in files1) // Directory.GetFiles(srcFolder) { // 連接到excel 數(shù)據(jù)源, xlsx要用ACE string strConn = ("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source= " + file.FullName + "; Extended Properties='Excel 12.0';"); OleDbConnection OledbConn = new OleDbConnection(strConn); if (IsUsed(file.FullName)) { flag = IsUsed(file.FullName); continue; } try { OledbConn.Open(); // 存入datatable,Excel表示哪一個(gè)sheet,conn表示連接哪一個(gè)Excel文件(jet、ACE) OleDbDataAdapter dAdapter = new OleDbDataAdapter(strExcel, strConn); dAdapter.Fill(ds); OledbConn.Dispose(); OledbConn.Close(); } catch (Exception ex) { } } return flag; } // 將datatable中的數(shù)據(jù)存入SQL server public void DataToSql(string equipName) { //初始化配置 sqlserver的服務(wù)器名用戶等 SqlConnection Conn = new SqlConnection(ConnStr); Conn.Open(); //配置SQLBulkCopy方法,真正用于復(fù)制數(shù)據(jù)到數(shù)據(jù)庫(kù)的方法 SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnStr, SqlBulkCopyOptions.UseInternalTransaction) { DestinationTableName = "ModelTest_HD" }; try { foreach (DataColumn item in ds.Tables[0].Columns) { //只復(fù)制所選的相關(guān)列 bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName); } //開(kāi)始復(fù)制到sql,每次在數(shù)據(jù)庫(kù)中添加 bulkCopy.WriteToServer(ds.Tables[0]); bulkCopy.Close(); //copy完了,要清空ds的內(nèi)容,不然會(huì)引起循環(huán)寫(xiě)入上一個(gè)內(nèi)容 ds.Tables.Clear(); } catch (Exception ex) { } finally { //關(guān)閉數(shù)據(jù)庫(kù)通道 Conn.Close(); } } protected override void OnStart(string[] args) { //啟動(dòng)服務(wù)時(shí)做的事情 } protected override void OnStop() { //停止服務(wù)時(shí)做的事情 } } }
認(rèn)真看注釋可以看出本程序的邏輯就是:
1、讀取到Excel數(shù)據(jù)
2、存Excel數(shù)據(jù)到SQL server
3、備份Excel文件到另一個(gè)文件夾
其中一些功能大家可以看一看,注釋也寫(xiě)的很清楚。對(duì)于初學(xué)者 configurationmanager的內(nèi)容是在 app.config中設(shè)置的,這里直接去配置就行(類似html)
foreach (DataColumn item in ds.Tables[0].Columns) { //只復(fù)制所選的相關(guān)列 bulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName); }
注意這一段代碼,表示只復(fù)制數(shù)據(jù)庫(kù)與Excel表中 “列名”一致的數(shù)據(jù),如果不一致就不復(fù)制。(注意數(shù)據(jù)的格式,int還char 這些必須弄清楚)
然后bulkCopy.WriteToServer(ds.Tables[0])這里,就是把ds.tables的數(shù)據(jù)復(fù)制到SQLserver ,Tables[0]表示ds第一張表(其實(shí)我們也只有一張表,至于怎么在dataset中新建table自己可以查查資料)
上述就是小編為大家分享的利用C# 怎么將Excel數(shù)據(jù)讀取到SQL server中了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。