2010-12-01 32 views
2

我必須在這個形式的Excel文件的文件:新奇SELECT從Excel通過OleDbDataAdapter的方法(C#)

Column 1 Column 2 Column 3 
data1  data2  
data1  data2 
data1  data2 
data1  data2 
data1  data2  data3 

也就是說,整個第3欄是除了最後一排空。 我通過OleDbDataAdapter訪問Excel文件,返回一個DataTable:這裏是代碼。

query = "SELECT * FROM [" + query + "]"; 
objDT = new DataTable(); 
objCmdSQL = this.GetCommand(); 
objCmdSQL.CommandText = query; 
objSQLDad = new OleDbDataAdapter(objCmdSQL); 
objSQLDad.Fill(objDT); 
return objDT; 

的一點是,在這種情況下我的代碼返回與單純的列1和列數據表2.
我的猜測是,JET引擎試圖通過最先細胞在每一個類型推斷列類型柱;作爲第一個值null,整個列被忽略。
我試圖填充零,這段代碼實際上是返回所有三列;這顯然是最不可取的解決方案,因爲我必須處理大量的小文件。
反轉選擇範圍(從「A1:C5」到「C5:A1」)也不起作用。 我正在尋找更優雅的東西。
我已經發現了一些討論類型不匹配的帖子(int列中的varchar單元格,反之亦然),但實際上並未發現與此相關的任何內容。
感謝您的閱讀!

編輯

再次怪異行爲。我必須主要處理Excel 2003 .xls文件,但由於此問題已得到解答,因此我認爲我可以針對Excel 2007 .xslx文件測試我的代碼。 連接字符串如下:

string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;"""; 

我得到的「外部表不是預期的格式」異常,我估計是標準的異常時,有ACE/JET和文件版本不匹配是打開。

字符串

Provider=Microsoft.ACE.OLEDB.12.0 

意味着,我使用的是最新的OLEDB的版本,我參加了一個快速瀏覽一下四周,這個版本是用來處處有需要連接的.xlsx文件。
我試過了,只是一個香草提供者(只是Excel 12.0,沒有IMEX或HDR),但我得到了同樣的異常。
我在.NET 2.0.50727 SP2上,也許有時間升級?

+0

因此,Excel中的列上沒有標題?你有沒有試過連接上的IMEX開關? – Sorax 2010-12-01 15:57:28

+0

有一些標題,但我選擇的表格中只包含數據的部分避免了水平和垂直標題。 – SimoneF 2010-12-02 08:09:34

回答

7

我重新創建了你的情況,並正確地返回了3列。也就是說,前兩列完全填充了數據,第三列包含null,直到最後一行有數據。

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"; 
DataTable dt = new DataTable(); 
OleDbConnection conn = new OleDbConnection(connString); 
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn); 

adapter.Fill(dt); 

注意我用了Access Database Engine(ACE)提供商,其成功的老Joint Engine Technology(JET)提供商,和我的結果可能代表了兩者之間的行爲差​​異。當然,如果你還沒有使用它,我建議使用ACE提供商,因爲我相信微軟也會這樣做。此外,請注意連接的Extended Properties

「HDR =是;」表示第一個 行包含列名,而不是數據。 「HDR =否;」表明相反。

「IMEX = 1;」告訴驅動程序始終將 作爲文本讀取「intermixed」(數字,日期,字符串等)數據列。 請注意,此選項可能會影響 Excel工作表寫入訪問否定。

讓我知道這是否有幫助。