2009-11-25 61 views
0

我想允許我的應用程序從XLS文件導入數據。我已經用CSV文件和XML文件執行此操作,但希望爲用戶打開範圍。我在加載文件時遇到問題。我們將文件(XLS,CSV,XML)加載到數據集中並從那裏開始處理。爲XLS加載代碼如下使用Microsoft Jet引擎讀取XLS文件

FileInfo fi = new FileInfo(filename); 

//create and open a connection with the supplied string 
OleDbConnection objOleDBConn; 
objOleDBConn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", fi.FullName)); 
objOleDBConn.Open(); 

DataTable dt = objOleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

if (dt == null || dt.Rows.Count == 0) 
{ 
    return; 
} 

string sheet = dt.Rows[0]["TABLE_NAME"].ToString(); 

//then read the data as usual. 
OleDbDataAdapter objOleDBDa; 
objOleDBDa = new OleDbDataAdapter(string.Format("select * from [{0}]",sheet), objOleDBConn); 
objOleDBDa.Fill(data); 
objOleDBConn.Close(); 

所以我的數據被加載好了,但它似乎設置各列的數據類型,這是我的一列的問題。這是一個場,我們選擇接受False,True,Yes,No,YN。有一些代碼稍後將其轉換爲布爾值。這工作正常CSV文件(連接字符串不同),但在XLS,如果前10行是說FALSETRUE,然後說第11說YES,那麼我只是得到一個空條目。我猜它讀取了前幾個條目,並根據它來確定數據類型?

問題:有沒有一種方法可以根據前幾個條目關閉標識列數據類型的機制?

+0

你可以嘗試添加的MaxScanRows = 1到連接字符串的擴展屬性,再有紙張的第一行中的文本字段。我從來沒有嘗試過,但它可能工作? – Tester101 2009-11-25 13:08:56

回答

0

有一個註冊表設置來告訴Jet提供程序要讀取多少行以推斷列的數據類型。它默認爲8我相信。它是:

HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows 

(更改版本適用)。在你的情況,它已經傳染布爾值,因此忽略字符串值「是」。

+0

謝謝,但如果您沒有權限訪問註冊表會發生什麼情況,因爲該用戶的安全策略被鎖定。我不相信微軟會寫一個功能,爲了關閉它,你必須設置功能來測試一切,只是爲了發現你不想使用該功能,似乎倒退了。 謝謝 將 – wdhough 2009-11-26 10:35:28

+0

短片分裂成許多8行牀單,沒有太多,你可以做那麼。 – 2009-11-26 12:05:49

0

試試這個OleDBAdapter Excel QA我通過堆棧溢出發佈。

我填寫工作表列瓦特/所有的TRUE或FALSE,然後在幾個摔「是」或「否」值隨機它工作得很好......在調試模式下

運行,然後點擊DataSet Visualizer填充後查看結果。 或者,這增加了代碼的結尾輸出

// DataSet:   
Object row11Col3 = ds.Tables["xlsImport"].Rows[11][3]; 
string rowElevenColumn3 = row11Col3.ToString(); 
相關問題