【问题标题】:How to get Excel.Application instance in C#?如何在 C# 中获取 Excel.Application 实例?
【发布时间】:2019-11-29 14:28:40
【问题描述】:

我尝试使用这种方法在我的代码中获取 Excel 应用程序:

Excel.Application xlApp = GetApplication();
if (xlApp == null) xlApp = new Excel.Application();

在哪里

private Excel.Application GetApplication()
    {
        Excel.Application result = null;

        try
        {
            result = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            //Excel is not open
        }

        return result;
    }

但是 System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") 总是抛出异常,即使 Excel 应用程序打开。

异常:HRESULT:0x800401E3

堆栈跟踪:

   in System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk)
   in System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
   in RaceToolTests.UnitTest1.GetApplication() in C:\Users\...

【问题讨论】:

  • 您是在使用 only Interop 还是您也在使用 ClosedXML?你有没有一行using Excel = Microsoft.Office.Interop.Excel; 我在问,因为你的代码对我来说非常好。
  • 我只使用互操作。在我的代码中我添加了:using Excel = Microsoft.Office.Interop.Excel;
  • 您的 Excel 版本是否与 Interop 版本匹配,例如Excel 2010 是 14.0 还是 2016 是 16.0?你用的是什么版本?
  • 您是否尝试过这里的解决方案 - stackoverflow.com/questions/6682678/…?你的真的很接近它。
  • 这个异常仅仅意味着它找不到一个正在运行的实例。这是一个很可能的结果,问题是可能有多个正在运行的实例,而您总是非常关心您连接到哪个实例。您需要阅读讨论该行为的 KB artlcle

标签: c# excel interop comexception


【解决方案1】:

请尝试以下代码:

//import
using Excel = Microsoft.Office.Interop.Excel;

//define
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;

private void openXL()
{

    string fileName = "PATH\\FILE_NAME.xlsx"; ;

    xlApp = new Excel.Application();
    xlWorkBook = xlApp.Workbooks.Open(fileName);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
}

【讨论】:

  • 我已经打开了一个 Excel 实例。我想获取该实例而不是打开一个新实例。
  • 您的“xlApp”是公开的还是全球的?如果它是全局或公共的,您可以使用它
  • 也许我提出了一个令人困惑的问题。关键是我需要以编程方式更新必须在 Excel 中打开的文件而不更改其路径。为此,我想在 Excel 中关闭、保存并重新打开它。这就是为什么我想要一种方法来识别托管我感兴趣的文件的 Excel 实例(可能在各种不同的 Excel 打开实例中)。
【解决方案2】:

是的,可以不创建新的 Excel 实例。使用下面获取 Excel 应用程序的现有实例。

var path = @"C:\Temp";
var excelFileName = $@"{path}\Sample.xlsx";

var excelApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
// Make the object visible.
excelApp.Visible = true;

// open workbook
Excel.Workbook xlWorkbook = excelApp.Workbooks.Open(excelFileName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2019-07-08
    相关资源
    最近更新 更多