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

使用Interop创建Excel工作簿时遇RPC_E_SERVERFAULT错误求助

问题诊断与修复方案

常见原因分析

HRESULT 0x80010105 (RPC_E_SERVERFAULT) 是Excel COM服务端内部错误,结合你的环境和代码,触发点大概率是:Excel进程残留、权限不足、Interop版本不兼容、代码逻辑错误。

修复步骤

1. 清理残留的Excel进程

打开任务管理器,找到所有EXCEL.EXE进程并结束。未正确释放COM对象会导致Excel进程驻留,直接阻碍新实例创建工作簿。

2. 调整权限设置

  • 文件系统权限:确保运行程序的账户拥有E盘的读写权限,避免保存操作触发权限连锁错误。
  • DCOM权限配置:
    1. 打开「组件服务」→「计算机」→「我的电脑」→「DCOM配置」。
    2. 找到「Microsoft Excel Application」,右键选择「属性」。
    3. 在「安全」选项卡中,分别设置「启动和激活权限」「访问权限」,添加当前运行账户并授予「允许」权限。

3. 修正代码逻辑错误

你的代码存在两处关键问题:

  • SaveAs调用对象错误:Worksheet.SaveAs是无效操作,需调用Workbook.SaveAs,且必须指定完整文件名(不能仅传目录)。
  • 未正确释放COM对象:Interop COM对象不会被.NET垃圾回收自动清理,需手动释放避免进程残留。

修正后的代码示例:

using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

public void GenerateExcel()
{
    Excel.Application excelApp = null;
    Excel.Workbook workbook = null;
    Excel._Worksheet workSheet = null;
    DataTable dt = dbConn.GetExcelDataforScheduler();

    try
    {
        excelApp = new Excel.Application();
        // 无需传递misValue,使用默认参数即可创建新工作簿
        workbook = excelApp.Workbooks.Add();
        workSheet = workbook.ActiveSheet;

        // 写入表头
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            workSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
        }

        // 写入数据行,处理日期类型避免格式异常
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                var cellValue = dt.Rows[i][j];
                workSheet.Cells[i + 2, j + 1] = cellValue is DateTime dateVal 
                    ? dateVal.ToString("yyyy-MM-dd HH:mm:ss") 
                    : cellValue;
            }
        }

        // 指定完整保存路径(必须包含文件名)
        string savePath = @"E:\SchedulerData.xlsx";
        workbook.SaveAs(savePath);
    }
    catch (Exception ex)
    {
        throw new Exception("Excel生成失败", ex);
    }
    finally
    {
        // 强制释放COM对象,彻底清除进程残留
        if (workSheet != null) Marshal.ReleaseComObject(workSheet);
        if (workbook != null)
        {
            workbook.Close();
            Marshal.ReleaseComObject(workbook);
        }
        if (excelApp != null)
        {
            excelApp.Quit();
            Marshal.ReleaseComObject(excelApp);
        }
    }
}

4. 匹配Interop与Office版本

你使用的Microsoft.Office.Interop.Excel 1.9.0.0版本与Office 2016不兼容,Office 2016对应的PIA版本应为v16.0。解决方法:

  • 卸载当前旧版本Interop包,重新安装Office 2016对应的PIA(通过Office安装程序勾选「Office共享功能→.NET可编程性支持」)。
  • 或通过NuGet安装Microsoft.Office.Interop.Excel包,选择16.0.0.0左右的兼容版本。

替代方案:无Office依赖的Excel生成库

服务器环境不推荐用Interop Excel(依赖本地Office、稳定性差),推荐以下开源库:

1. EPPlus(推荐,仅支持.xlsx)

using OfficeOpenXml;
using System.IO;

public void GenerateExcelWithEPPlus()
{
    DataTable dt = dbConn.GetExcelDataforScheduler();
    string savePath = @"E:\SchedulerData.xlsx";

    using (ExcelPackage package = new ExcelPackage())
    {
        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("SchedulerData");
        
        // 写入表头并设置加粗样式
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            worksheet.Cells[1, i + 1].Value = dt.Columns[i].ColumnName;
            worksheet.Cells[1, i + 1].Style.Font.Bold = true;
        }

        // 批量写入数据
        worksheet.Cells["A2"].LoadFromDataTable(dt, false);

        // 保存文件
        package.SaveAs(new FileInfo(savePath));
    }
}

2. NPOI(支持.xls/.xlsx)

兼容新旧Excel格式,完全无需依赖Office,适合兼容性要求高的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:55:40