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

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.OpenXml NuGet包才能使用这段代码。

  • 检查驱动位数匹配
    确认运行SSDT包的环境中,安装的ACE驱动位数(32位/64位)和SSDT的运行位数完全一致。比如如果SSDT是32位模式运行,就必须安装32位的Microsoft Access Database Engine 2010 Redistributable,位数不匹配也会导致文件加载失败的奇怪问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:17:25