C# oleDb方法讀取Excel文件

今天學習的是從FTP上下載Excel文件,DataTable接收數據以後,在DataTable中經過篩選,刪減修改以後把數據插入到DB相應表中。php

優勢:讀取方式簡單、讀取速度快html

缺點:除了讀取過程不太靈活以外,這種讀取方式還有個弊端就是,當Excel數據量很大時。會很是佔用內存,當內存不夠時會拋出內存溢出的異常。sql

命名空間:using System.Data.OleDb;ide

另注:學習

參數:HDR=NO/YES測試

OleDb讀入一個Excel工做表(Sheet)的數據後,工做表的第一行會變成標題,第二行起,逐行變爲DataTable的一個數據行(Row)ui

如下是代碼:spa

        //根據excle的路徑把第一個sheel中的內容放入datatable
        public static DataTable ReadExcelToTable(string path)//excel存放的路徑
        {
            try
            {

                //鏈接字符串
                string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; // Office 07及以上版本 不能出現多餘的空格 並且分號注意
                //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; //Office 07如下版本 
                using (OleDbConnection conn = new OleDbConnection(connstring))
                {
                    conn.Open();
                    DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //獲得全部sheet的名字
                    string firstSheetName = sheetsName.Rows[0][2].ToString(); //獲得第一個sheet的名字
                    string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查詢字符串
//string sql = string.Format("SELECT * FROM [{0}] WHERE [日期] is not null", firstSheetName); //查詢字符串
OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring); DataSet set = new DataSet(); ada.Fill(set); return set.Tables[0]; } } catch (Exception) { return null; } }

項目中還能夠結合流文件(fileStream)的操做,檢查每一行數據,數據類型等,一行一行的插入到DB的表,使用DataTable的目的就是爲了檢查excel的行列數(主要是列數)是否符合要求,好比今天的測試中,
   excel

網友有個說法:string sqlExcel = ("select * from [計劃上sheet$A3:D8]"); sheet$後面是範圍A3到D8的 若是行不肯定 要取到後面行  就把D8改爲Dcode

後來看到的,因此還沒測試,

以上這個問題我也在想,是否是excel裏面sheet的活動界面的問題,select * from [sheetName]選取了全部的列數,因此致使可能DaTaTable致使空列,建議在DaTaTable進行刪改,或者用datagrid修改,隨後保存修改到DATATABLE中。

對於其餘的excel讀取方式,參見博客地址:http://www.cnblogs.com/icyJ/p/ReadExcel.html

另外對於參數connstring字符串的標準,

1)HDR表示要把第一行做爲數據仍是做爲列名,做爲數據用HDR=no,做爲列名用HDR=yes;

使用 Excel 工做簿時,默認狀況下,區域中的第一行是標題行(或字段名稱)。若是第一個區域不包含標題,您能夠在鏈接字符串的擴展屬性中指定 HDR=NO。若是您在鏈接字符串中指定 HDR=NO,Jet OLE DB 提供程序將自動爲您命名字段(無論excel中的列叫什麼名字,F1 表示第一個字段,F2 表示第二個字段,依此類推,select F1,F2 from [sheet1$]);

2)IMEX=1將全部讀入數據看做字符,其餘值(0、2)請查閱相關幫助文檔;

3)若是出現「找不到可安裝的isam」錯誤,通常是鏈接字符串錯誤

 

string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

 

 

 

HDR表示要把第一行做爲數據仍是做爲列名,做爲數據用HDR=no,做爲列名用HDR=yes;

string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";

 

接着繼續:

這裏出現的問題是:

很容易形成讀入不少的空行到datatable中,好比下面的excel,咱們基本上看不出到底有多少實際的行數:

string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查詢字符串

 

string sql = string.Format("SELECT * FROM [{0}] WHERE [日期] is not null", firstSheetName); //查詢字符串,字段名注意必定要和excel中標題名一致,有空格哦~

 

note:這時HDR參數必須是YES,不然會報異常

參考:http://www.devba.com/index.php/archives/4024.html

 Excel讀取存在空白的緣由:表格有兩個後臺屬性,分別是已使用的最大行數和已使用的最大列數。這個 adapter多是按這兩個屬性來的,無法改。讀取代碼部分如圖所示,圖示爲主要解析Excel到DataTable.通過仔細監視代碼咱們會發如今 da.Fill(dt)時,把空白行填充到DataTable了。整體來說這個是有微軟提供的方法和規則,那麼是沒辦法改的。

解決辦法有如下幾個:

一、在讀取的時候SQL語句上進行過濾:Select * From  SheetName where col1 is not null and col2 is not null 在讀取的過程時,對空白行進行非空顧慮,建議過濾非空時,根據業務,把不可爲空的Excel中的列做爲col1和col2;固然能夠先刪除空白行後再進行 讀取;總之先把空白行在讀取到Excel前除掉;

二、在讀取Excel到DataTable後再過濾掉空白行;DataTable空白行處理空白行方法應該不少的;可是在進行業務校驗的時候必定須要先刪除空白行!

相關文章
相關標籤/搜索