【问题标题】:Excel COMException 0x800A03EC when user cancels file overwrite用户取消文件覆盖时 Excel COMException 0x800A03EC
【发布时间】:2010-08-06 21:29:36
【问题描述】:

我的代码可以将 Excel 文件保存到用户无法更改的特定位置和文件名。当文件不存在并静默保存时,它工作正常。如果文件已经存在并且用户选择覆盖它,那么它也可以正常工作。当它已经存在并且用户取消保存时会出现问题。这会导致抛出 COMException 0x800A03EC。有什么想法吗?

参考:Microsoft Excel 12.0 对象库

excelWorkbook.SaveAs(resultsFilePath, XlFileFormat.xlExcel8);

【问题讨论】:

    标签: c# excel interop


    【解决方案1】:

    把它放在一个 Try/Catch 块中,就像你应该处理任何可能失败的代码一样?如果它在 try/catch 块中,那么根据您提供给我们的信息,该设计从定义上讲是有缺陷的,因为....

    1. ExcelWorkbook.Save() 函数是您无法更改的。就是这样……
    2. 失败是因为用户取消了保存,并且您在没有首先检查文件是否存在并且 Excel 提示用户给他们取消的机会的情况下调用 SaveAs 方法,并且唯一的选择是此错误,那么唯一的其他选择就是不给用户该选择。

    作为一般建议,我会说您应该检查文件是否存在,并让用户有机会在您的代码中取消。如果他们取消,问题就避免了。如果他们选择不取消,只需在调用 Excel Save() 函数之前删除文件即可。

    或者,您可以使用SaveAs() 函数代替Save(),并将名为ConflictResolution 的可选参数设置为XlSaveConflictResolution.xlLocalSessionChanges

    (以防万一你问,我知道处理来自 C# 的可选参数很痛苦,所以请查看 this previous question 了解如何处理这些......)

    【讨论】:

    • 谢谢。我最终首先检查自己是否存在文件,然后使用 MessageBox.Show 提示用户是否要覆盖。然后,在调用 WorkBook.SaveAs 之前,我设置 DisplayAlerts = false 否则 excel 将尝试抛出它自己的对话框。我在保存后设置了 DisplayAlerts = true。
    【解决方案2】:

    这个怎么样:

    try
    {
       excelWorkbook.SaveAs(resultsFilePath, XlFileFormat.xlExcel8);
    }
    catch // If you want, you can try and catch the actual exception here
    {
       // If it gets here, the user probably cancelled (or something else
       // went wrong) You should handle those cases as needed. In the case
       // of the user cancelling, just do nothing here!
    }
    

    【讨论】:

    • 我会投票给这个。这是我以代码示例的形式发布的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2011-09-14
    相关资源
    最近更新 更多