簡體   English   中英

使用SSIS腳本任務讀取Excel單元格值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM