You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS包开发:如何导入Excel中的指定数据表而非整个工作表

解决SSIS中获取Excel命名数据表的问题

问题根源

你的代码通过GetSchema("Tables")默认获取的是Excel的工作表(WORKSHEET类型),而你需要的是命名数据表(TABLE类型)——ACE OLEDB驱动会将这两类对象分开归类,所以需要针对性筛选。另外固定长度的数组可能导致数据遗漏,连接字符串的配置也会影响驱动对命名区域的识别。

修正后的代码

替换原Script Task中的代码,做以下关键调整:

  • 用List<string>替代固定长度数组,避免限制可获取的数据表数量
  • 筛选TABLE_TYPE为"TABLE"的记录,只获取命名数据表
  • 优化连接字符串配置,确保驱动正确识别命名区域
string excelFile = Dts.Variables["FileName"].Value.ToString();
string connectionString = string.Format(
    "Provider=Microsoft.ACE.OLEDB.16.0;Data Source={0};Extended Properties=\"EXCEL 12.0 XML;HDR=YES;IMEX=1;\"", 
    excelFile
);

List<string> excelTables = new List<string>();

using (OleDbConnection excelConnection = new OleDbConnection(connectionString))
{
    excelConnection.Open();
    DataTable tablesInFile = excelConnection.GetSchema("Tables");

    foreach (DataRow tableRow in tablesInFile.Rows)
    {
        string tableType = tableRow["TABLE_TYPE"].ToString();
        // 只筛选命名数据表(TABLE类型),排除工作表(WORKSHEET类型)
        if (tableType.Equals("TABLE", StringComparison.OrdinalIgnoreCase))
        {
            string tableName = tableRow["TABLE_NAME"].ToString();
            excelTables.Add(tableName);
        }
    }

    // 将List转换为数组赋值给变量
    Dts.Variables["ExcelTables"].Value = excelTables.ToArray();
}

Dts.TaskResult = (int)ScriptResults.Success;

额外检查项

  1. 驱动兼容性:确保安装的ACE驱动版本(32位/64位)与SSIS包的运行环境一致。如果SSIS在32位模式下运行,必须安装32位ACE驱动,反之亦然。
  2. 文件类型适配:如果你的Excel文件是启用宏的.xlsm格式,需要将连接字符串中的EXCEL 12.0 XML改为EXCEL 12.0 Macro。
  3. 命名区域有效性:确认Excel文件中的目标数据表是正式的命名区域(不是手动选中单元格的临时标记),可以通过Excel的「公式」选项卡→「名称管理器」查看验证。

内容的提问来源于stack exchange,提问作者MrQuestion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:42:56