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;
额外检查项
- 驱动兼容性:确保安装的ACE驱动版本(32位/64位)与SSIS包的运行环境一致。如果SSIS在32位模式下运行,必须安装32位ACE驱动,反之亦然。
- 文件类型适配:如果你的Excel文件是启用宏的
.xlsm格式,需要将连接字符串中的EXCEL 12.0 XML改为EXCEL 12.0 Macro。 - 命名区域有效性:确认Excel文件中的目标数据表是正式的命名区域(不是手动选中单元格的临时标记),可以通过Excel的「公式」选项卡→「名称管理器」查看验证。
内容的提问来源于stack exchange,提问作者MrQuestion
相关产品推荐
相关产品推荐

