2012-11-29 168 views
3

讀取Excel單元格的值我試圖通過SSIS ScriptTask讀取Excel文件來檢查該工作表某些細胞值。SSIS的腳本任務

在代碼示例中,你可以看到STRSQL設置爲「H4:H4」只讀一個細胞。這個單元格只能有一個真或假的值。 由於我還需要檢查B1中的某個字符串值我想擴展此版本。

string filePath = "c:\\test\\testBoolean.XLSX"; 
    string tabName = "testSheet$"; 
    string strSQL = "Select * From [" + tabName + "H4:H4]"; 
    String strCn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" 
        + filePath + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\";"; 
    OleDbConnection cn = new OleDbConnection(strCn); 
    int iCnt = 0; 
    OleDbDataAdapter objAdapter = new OleDbDataAdapter(strSQL, cn); 
    DataSet ds = new DataSet(); 
    objAdapter.Fill(ds, tabName); 
    DataTable dt = ds.Tables[tabName]; 

    foreach (DataRow row in dt.Rows) 
    { 
     iCnt = iCnt + 1; 
     // some processing.... 
    } 

我不明白的是爲什麼我得到一個布爾值與上述STRSQL語句或包含像這樣在同一行號碼的任何statment:

string strSQL = "Select * From [" + tabName + "F4:H4]"; 

調試,輸出:

row.ItemArray[2] false object {bool} 

當我設置不同的範圍像這樣的:

string strSQL = "Select * From [" + tabName + "F1:H4]"; 

我鬆散的布爾值的識別:

row.ItemArray[2] "FALSE" object {string} 

我寧願喜歡用其他的處理任務的布爾值。

如何我除了解決這個問題也讀B2價值?

回答

3

連接字符串指定IMEX=1,告訴司機把混雜的數據類型爲文本。 (參見MSDN文章Excel Connection Manager的「使用注意事項」部分。)

因此,當指定的單個行

string strSQL = "Select * From [" + tabName + "F4:H4]"; 

有針對第三列只有一個可能的數據類型,並且驅動器是能夠正確推斷它。但是,當您指定多行

string strSQL = "Select * From [" + tabName + "F1:H4]"; 

範圍H1任何值:H4不是bool,司機翻譯所有值在該列string秒。

假設你實際上在做H列混合數據類型和只關心兩個特定細胞中的值,最簡單的辦法是單獨查詢每個細胞。有關如何做到這一點的一些想法,請參閱Import a single Excel cell into SSIS

+0

這實際上是有道理的:-)感謝您的信息 - 我忽略了IMEX設置。 – TonyC

1

我會克隆大部分代碼產生兩個不同的SELECT語句來查詢你有獨立的SQL語句後的兩種不同的細胞。

其實我可能會走得更遠,切絲整個腳本到SSIS組件例如執行SQL任務或數據流任務。