用SSIS脚本任务读取Excel单元格值

我正在尝试通过SSIS ScriptTask读取Excel文件以检查该工作表中的某些单元格值。

在代码示例中,您可以看到strSQL被设置为“ H4:H4 ”,只读取一个单元格。 这个单元格只能有一个真或假的价值。 因为我也需要检查B1中的某个string值,所以我想扩展这个版本。

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语句或任何包含相同行号的语句得到一个布尔值,如下所示:

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

debugging输出:

 row.ItemArray[2] false object {bool} 

但是当我设置这样一个不同的范围:

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

我忽视了对价值的认识:

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

我宁愿将bool值用于其他处理任务。

除了阅读B2值之外,我怎样才能解决这个问题?

您的连接string指定IMEX=1 ,它告诉驱动程序将混合的数据types视为文本。 (请参阅MSDN文章Excel连接pipe理器的“使用注意事项”一节。)

因此,当你指定一个单一的行

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

第三列只有一种可能的数据types,驱动程序能够正确地推断出它。 但是,当您指定多行时

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

并且范围H1:H4中的任何值都不是bool ,驱动程序将该列中的所有转换为string s。

假设你确实在列H中有混合的数据types,只关心两个特定单元格中的值,最简单的解决scheme是单独查询每个单元格。 请参阅将单个Excel单元格导入SSIS ,以了解如何执行此操作。

我会克隆大部分的代码来产生两个单独的SELECT语句来查询您使用单独的SQL语句之后的两个不同的单元格。

实际上,我可能会进一步将整个脚本分解成SSIS组件,例如执行SQL任务或数据stream任务。