ExcelDnaUtility.Application 创建一本新书 (Book1),因此 excel 中的第一本新书是 Book2

ExcelDnaUtility.Application creating a new book (Book1), so first new book in excel is Book2

我有一个 C# ExcelDna 项目,一般来说没有问题。但是,我在 AutoOpen() 期间使用 ExcelDna.Application 打开电子表格(一个 xlam)。我注意到第一个 "USER CREATED" 工作簿,使用 Excel 菜单是 Book2。为了隔离这一点,我做了下面的代码。即使不打开任何工作簿,仅引用 ExcelDna.Application 似乎也会创建一个影子工作簿,将工作簿计数器移动到 Book2。这是一个已知的东西,一个错误?或者我做错了什么! Thanks/Cheers

public class ExcelDNAXllEntry : IExcelAddIn
  {
      public void AutoOpen()
      {
          // EXCEL DNA  STUFF ---------------------------------------------------------------------------
          ComServer.DllRegisterServer();
          //-----------------------------------------------------------------------------------------------
          Application x = (Application)ExcelDnaUtil.Application;

我希望第一个打开图书的用户是 book1。没有硬错误或错误消息,只有我想避免的奇怪行为。我们有很多用户,如果他们开始看到 Book2,我会回答很多问题:)

当 Excel 加载您的加载项时,COM 对象模型(通常)尚未初始化。除了在幕后创建一个新的 'macro' 类型的工作簿之外,我知道没有其他方法可以使 Excel 进入我们可以访问应用程序 COM 对象的状态。结果就是您报告的行为。

我很乐意在 Excel-DNA 中加入另一种方法。

我通过

解决了这个问题
  1. 在 AutoOpen() 中添加第一行

    bool create = (bool)XlCall.Excel(XlCall.xlcNew, 1);
    
  2. 在功能区 OnLoad(IRibbonUI 功能区)

    excel = (Excel.Application)ExcelDnaUtil.Application;
    
    XlCall.Excel(XlCall.xlcFileClose, false);
    

第一步确保ExcelDna.Integration/Excel.cs 不会使用GetApplicationFromNewWorkbook。 XlCall.Excel 中的第二个参数 1 表示“Sheet1”是内部创建的,而不是“Book1”

为了不显示空的“Sheet1”,第二步自行关闭window。 现在从 Book1,Book2 开始计数...

我在 Office365、Excel 2106 和 Excel 2013 上测试了它,所有 x64 都有效。