SSDT问题:Excel 2007文件导致文件循环功能中断
问题分析
你碰到的这个问题本质是Microsoft.ACE.OLEDB.12.0驱动对Excel 2007宏模板的兼容性差异——虽然Excel 2007已经采用Office Open XML格式,但它保存的宏模板(.xltm)在文件结构元数据上和Excel 2010+版本的宏模板有细微区别,而你当前连接字符串里的EXCEL 12.0 XML属性是针对无宏的OOXML文件设计的,驱动无法正确识别2007版宏模板的结构,导致加载失败;而用高版本Excel重新保存后,文件元数据会被更新为符合驱动预期的格式,所以就能正常运行了。
解决方案
下面是几个可行的解决办法,按优先级排序:
调整连接字符串的扩展属性
把连接字符串里的EXCEL 12.0 XML替换为EXCEL 12.0 Macro,这是专门针对宏文件的属性配置,能让驱动正确识别Excel 2007的宏模板。修改后的完整连接字符串:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=;Extended Properties="EXCEL 12.0 Macro;HDR=YES";这个方法最简单,不需要修改文件或额外代码,直接适配2007版宏模板。
自动化预处理Excel 2007文件
如果不想让用户手动重新保存文件,可以在SSDT包中添加一个脚本任务,用OpenXML SDK自动将2007版模板重新保存为高版本兼容格式,再执行加载逻辑。这里给个C#脚本的示例(不需要安装Office客户端):using System; using DocumentFormat.OpenXml.Packaging; using Microsoft.SqlServer.Dts.Runtime; public void Main() { string sourcePath = Dts.Variables["User::ExcelFilePath"].Value.ToString(); string updatedPath = sourcePath.Insert(sourcePath.LastIndexOf('.'), "_updated"); // 重新保存文件以更新元数据 using (SpreadsheetDocument doc = SpreadsheetDocument.Open(sourcePath, true)) { doc.SaveAs(updatedPath).Close(); } // 将变量更新为新文件路径 Dts.Variables["User::ExcelFilePath"].Value = updatedPath; Dts.TaskResult = (int)DTSExecResult.Success; }注意:需要在SSDT项目中安装
DocumentFormat.OpenXmlNuGet包才能使用这段代码。检查驱动位数匹配
确认运行SSDT包的环境中,安装的ACE驱动位数(32位/64位)和SSDT的运行位数完全一致。比如如果SSDT是32位模式运行,就必须安装32位的Microsoft Access Database Engine 2010 Redistributable,位数不匹配也会导致文件加载失败的奇怪问题。
内容的提问来源于stack exchange,提问作者Default

