[英]Read Excel cell values with SSIS script task
我試圖通過SSIS ScriptTask讀取Excel文件,以檢查該工作表中的某些單元格值。
在代碼示例中,您可以看到strSQL設置為“ H4:H4 ”以僅讀取一個單元格。 此單元格只能具有true或false值。 由於我還需要檢查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]";
我放棄了對bool值的認識:
row.ItemArray[2] "FALSE" object {string}
我更願意將bool值用於其他處理任務。
除了閱讀B2值之外,我該如何解決這個問題呢?
您的連接字符串指定IMEX=1
,它告訴驅動程序將混合數據類型視為文本。 (請參閱MSDN文章Excel連接管理器的“使用注意事項”部分。)
因此,當您指定單行時
string strSQL = "Select * From [" + tabName + "F4:H4]";
第三列只有一種可能的數據類型,驅動程序能夠正確推斷它。 但是,當您指定多行時
string strSQL = "Select * From [" + tabName + "F1:H4]";
並且H1:H4中的任何值都不是bool
,驅動程序將該列中的所有值都轉換為string
s。
假設事實上你確實在H列中有混合數據類型並且只關心兩個特定單元格中的值,最簡單的解決方案是單獨查詢每個單元格。 請參閱將單個Excel單元格導入SSIS以獲取有關如何執行此操作的一些想法。
我將克隆大部分代碼以生成兩個單獨的SELECT語句,以使用單獨的SQL語句查詢您所使用的兩個不同單元格。
實際上我可能會更進一步,將整個腳本分解為SSIS組件,例如執行SQL任務或數據流任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.