【问题标题】:Opening Excel file in C# closing erroring在 C# 中打开 Excel 文件关闭错误
【发布时间】:2013-09-10 20:28:48
【问题描述】:

我在 .NET 4.0 (C#) 中打开一个 Excel 文件。我正在使用 12.0 版本的互操作。 Excel 文件是 xls(旧)。我可以很好地打开它,但是 workbook.close() 会导致 COM 异常,周围没有任何实际细节。

oExcel = new Application();
oExcel.Visible = true;
oExcel.DisplayAlerts = false;

oBooks = oExcel.Workbooks;
oBook = null;
oBook = oBooks.Open(finalFilename);

oBook.Close();   // this gives COM Exception

任何想法我做错了什么?

这是有趣的事情。我不必保存这个。在它完成它需要做的事情之后,我将我需要的数据提取出来并存储起来,我刚刚复制的工作簿就可以消失了。

【问题讨论】:

    标签: c# .net excel automation


    【解决方案1】:
            Excel.Application objExcel = new Excel.Application();
            Excel.Workbook objWorkbook = (Excel.Workbook)(objExcel.Workbooks._Open(@"D:\a.xls", true,
            false, Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value, Missing.Value,
            Missing.Value));
    

    你的代码...

                objWorkbook.Save();         
                objWorkbook.Close(true, @"C:\Documents and Settings\Administrator\b.xls", true);
                objExcel.Quit();
    

    【讨论】:

    • 尝试将参数转换为对象
    • 因此,当我调用 Save() 时,它会提示我有关加载项 xla 项目“一个名为 'addin name here' 的文件已经存在于该位置。你想替换它吗?哪个没有”对我来说,为什么它认为它与我打开文件的位置相同,因为我在那里看不到它,这对我来说真的没有意义。几乎就像它试图将它保存在安装 xla 的位置一样。不知道为什么会尝试这样做。我认为 Save() 只会查看工作簿本身而不是 xla。如果我从桌面 excel 保存,它永远不会提示我。
    • Excel 不会退出,因为您的应用程序仍然持有对 COM 对象的引用。我猜您正在调用 COM 对象的至少一个成员而不将其分配给变量。切勿在 com 中使用 2 个点对象...
    • 我现在不在。如果我省略了 Save() 和 Close(),我会收到一个提示,询问我是否保存。如果我手动选择保存,那么一切都会正确结束,EXCEL 过程也会结束。因此,有了 Save() 函数,我得到这个 xla 提示,说要覆盖原始 xla 文件,如果我可以删除那个提示,我认为这会起作用。
    • 这在编程中并不常见;删除并保存,看看这个,也许有帮助:stackoverflow.com/questions/158706/…
    【解决方案2】:

    根据我的经验,打开和关闭错误很可能表明文件存在问题。 Excel desktop 非常宽容,可以优雅地处理文件的任何问题。该文件在 Excel 中可能看起来和工作正常,而不会显示出任何错误。

    您可以尝试在 Excel 中重新保存文件。如果仍然不起作用,请尝试创建一个新的电子表格并从旧文件中复制内容。

    【讨论】:

    • 所以我保存了一个空白工作簿,它可以工作。但是,这不是一个选项,因为我必须使用这些生成的工作簿,其中包含大量的 vba/dll 代码。这个工作簿有一个经过数字签名的插件,所以不确定这是否会导致问题?我不关心签名,但我怎样才能找出导致这个密切问题的原因?
    • 恐怕我没有更好的答案。如果工作簿是由第 3 方软件预先生成的,那么许多事情中的任何一个都可能是错误的。我的直觉是,您必须重新创建工作簿并省去很多麻烦,即使需要进行一些复制和粘贴。
    • 谢谢 ytran。这基本上是他们制作的应用程序,而不是您的正常工作簿,所以这是不可能的。不过我越来越近了。我从 C# 将一个函数注入到 VBA 项目中,该函数从 VBA 关闭工作簿。这可行,但是当它返回到 C# 时会引发错误,但我只是将其捕获并忽略它。现在一切正常,除了 EXCEL.exe 进程保持运行。只需要弄清楚我做错了什么。
    【解决方案3】:

    Workbook.Close 似乎不包含没有参数的方法 Close。

    http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.close.aspx

    方法签名: 无效关闭( 对象保存更改, 对象文件名, 对象路由工作簿 )

            object missing = Type.Missing;
            object noSave = false;
            oBook.Close(noSave, missing, missing);
    

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      相关资源
      最近更新 更多