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

迁移SSIS作业至新服务器后读取.xls文件遇OLEDB驱动错误求助

解决思路与方案

核心问题分析

Microsoft.Jet.OLEDB.4.0是仅支持32位的驱动组件,而Visual Studio 2022为纯64位环境,无法直接调用该驱动;即便安装了64位ACE驱动,若未正确配置连接管理器也无法生效。以下是针对性的解决方法:


方案一:替换为ACE驱动并配置连接字符串

直接修改Excel连接管理器的驱动类型,用支持64位的Microsoft.ACE.OLEDB.12.0替代Jet驱动:

  • 打开Excel Connection Manager的属性面板,找到ConnectionString属性
  • 将原字符串中的Provider=Microsoft.Jet.OLEDB.4.0;替换为Provider=Microsoft.ACE.OLEDB.12.0;,保留后续扩展属性(如Extended Properties="Excel 8.0;HDR=YES;IMEX=1;",Excel 8.0对应xls格式)
  • 若安装ACE驱动时遇兼容性冲突,使用静默安装命令:AccessDatabaseEngine.exe /quiet(避免与已安装的32位Office组件冲突)

方案二:用Script Task结合NPOI读取XLS(无驱动依赖)

通过C#脚本调用NPOI库读取xls文件,无需依赖OLEDB驱动或Office组件:

  1. 下载适配.NET Framework 4.7.2的NPOI DLL(NPOI.dll、NPOI.OOXML.dll、NPOI.OpenXmlFormats.dll、ICSharpCode.SharpZipLib.dll),添加到SSIS项目的引用中
  2. 在Script Task中编写读取逻辑(示例C#代码):
    using System.Data;
    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;
    using System.IO;
    using System.Data.SqlClient;
    
    public void Main()
    {
        string xlsPath = Dts.Variables["User::XlsFilePath"].Value.ToString();
        string targetConnStr = Dts.Variables["User::TargetDbConn"].Value.ToString();
        DataTable dataTable = new DataTable();
    
        // 读取XLS文件
        using (FileStream fs = new FileStream(xlsPath, FileMode.Open, FileAccess.Read))
        {
            HSSFWorkbook workbook = new HSSFWorkbook(fs);
            ISheet sheet = workbook.GetSheetAt(0); // 读取第一个工作表
    
            // 构建表头
            IRow headerRow = sheet.GetRow(0);
            foreach (ICell cell in headerRow)
            {
                dataTable.Columns.Add(cell.StringCellValue);
            }
    
            // 读取数据行
            for (int rowIdx = 1; rowIdx <= sheet.LastRowNum; rowIdx++)
            {
                IRow row = sheet.GetRow(rowIdx);
                if (row == null) continue;
    
                DataRow dataRow = dataTable.NewRow();
                for (int colIdx = 0; colIdx < headerRow.LastCellNum; colIdx++)
                {
                    ICell cell = row.GetCell(colIdx);
                    if (cell != null)
                    {
                        switch (cell.CellType)
                        {
                            case CellType.String:
                                dataRow[colIdx] = cell.StringCellValue;
                                break;
                            case CellType.Numeric:
                                dataRow[colIdx] = cell.NumericCellValue;
                                break;
                            case CellType.Boolean:
                                dataRow[colIdx] = cell.BooleanCellValue;
                                break;
                            default:
                                dataRow[colIdx] = DBNull.Value;
                                break;
                        }
                    }
                    else
                    {
                        dataRow[colIdx] = DBNull.Value;
                    }
                }
                dataTable.Rows.Add(dataRow);
            }
        }
    
        // 批量写入目标数据库
        using (SqlConnection conn = new SqlConnection(targetConnStr))
        {
            conn.Open();
            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
            {
                bulkCopy.DestinationTableName = "YourTargetTable";
                bulkCopy.WriteToServer(dataTable);
            }
        }
    
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    
  3. 确保Script Task的.NET版本设置为4.7.2(与SSIS 2022兼容)

方案三:PowerShell预处理转CSV后读取

将xls转换为CSV格式,再用SSIS的Flat File Source读取(CSV读取无需特殊驱动):

  1. 编写PowerShell脚本(推荐用ImportExcel模块,无需Office):
    # 首次运行需安装模块:Install-Module -Name ImportExcel -Force -Scope CurrentUser
    $xlsFilePath = "C:\Downloads\SourceFile.xls"
    $csvFilePath = "C:\Temp\ConvertedFile.csv"
    Import-Excel -Path $xlsFilePath -WorksheetName "Sheet1" | Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8
    
  2. 在SSIS中添加Execute Process Task,调用PowerShell执行上述脚本
  3. 后续用Flat File Source读取生成的CSV文件,完成数据导入

若无法使用ImportExcel模块,可依赖Office COM对象(需服务器安装Office):

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open($xlsFilePath)
$worksheet = $workbook.Worksheets.Item(1)
$worksheet.SaveAs($csvFilePath, 6) # 6对应CSV格式枚举值
$workbook.Close()
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

方案四:第三方SSIS组件(企业级场景)

使用支持64位xls读取的第三方组件(如CozyRoc Excel Source),此类组件无需依赖Jet/ACE驱动,但需付费授权。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:02:07