【问题标题】:Read Excel cell values with SSIS script task使用 SSIS 脚本任务读取 Excel 单元格值
【发布时间】:2012-11-17 14:50:27
【问题描述】:

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

在代码示例中,您可以看到 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 语句或任何包含相同行号的语句得到一个布尔值,如下所示:

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 值之外,我该如何解决这个问题?

【问题讨论】:

    标签: c# excel ssis datatable


    【解决方案1】:

    您的连接字符串指定了IMEX=1,它告诉驱动程序将混合数据类型视为文本。 (请参阅 MSDN 文章 Excel Connection Manager 的“使用注意事项”部分。)

    因此,当您指定单行时

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

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

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

    并且 H1:H4 范围内的 any 值不是 bool,驱动程序将该列中的 all 值转换为 strings。

    假设您确实在 H 列中确实有混合数据类型并且只关心两个特定单元格中的值,最简单的解决方案是单独查询每个单元格。请参阅 Import a single Excel cell into SSIS 了解有关如何执行此操作的一些想法。

    【讨论】:

    • 这实际上是有道理的 :-) 感谢您提供的信息 - 我忽略了 IMEX 设置。
    【解决方案2】:

    我将克隆大部分代码以生成两个单独的 SELECT 语句,以使用单独的 SQL 语句查询您所关注的两个不同的单元格。

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

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多