首页 > 解决方案 > 通过 Visual C++ 自动化 Excel 时如何防止超时?

问题描述

我正在使用 Visual C++ 2008 来自动化 Excel 2010,如下所示:

    CApplication ExcelApp;

    if (ExcelApp.CreateDispatch(_T("Excel.Application"), NULL))
    {
        CWorkbooks oWorkbooks;
        CWorkbook oWorkbook;

        //  Add a workbook
        oWorkbooks = ExcelApp.get_Workbooks();
        oWorkbook = oWorkbooks.Add(vOpt);

        //  Wait for user input
        //  ::Sleep(1000 * 60 * 15);

        oWorkbook.Activate();

        //  Save workbook           
        oWorkbook.SaveAs(COleVariant(strExcelFile), COleVariant((long)xlOpenXMLWorkbook), COleVariant(_T("")), COleVariant(_T("")),
                vFalse, vOpt, (long)xlNoChange, vOpt, vOpt, vOpt, vOpt, vOpt);

        ExcelApp.Quit();
    }

在自动化过程中,我需要等待用户输入并将其保存到 Excel 工作簿中。如果等待时间很长,例如 15 分钟,那么即将到来的 SaveAs 方法将失败,错误代码为 0x800a03ec,在https://social.msdn.microsoft.com/Forums/Lync/en-US/92ad0462中进行了描述-5bfe-4353-b9e2-d13e93e712c8/cannot-save-workbook-via-automation?forum=exceldev

在我的代码注释中,我使用 Sleep 函数来模拟将导致错误的 15 分钟等待时间。

在这种情况下,有没有办法让自动化保持活动状态以防止自动化连接超时?

为了方便复现错误,我在VS2008中做了如下两个测试项目:

  1. EADLL,这是一个 MFC DLL。它包含一个 TestExcel 函数,该函数将自动执行 Excel 2010 并调用 SaveAs 将 Excel 文件保存为 .xlsx 文件格式。如果让睡眠时间达到 15 分钟,则会发生异常。

  2. EAApp,这是一个基于对话框的应用程序来调用 DLL。

我在 Windows 7 Ultimate(带 SP1)64 位版本上重新测试 EADLL 和 EAApp,并确认睡眠 15 分钟时会出现错误。

EADLL 和 EAApp 均已压缩,可从以下位置下载:

https://www.dropbox.com/s/6btgglnt9znadwp/EA.zip?dl=0

谢谢

标签: excelvisual-c++automationtimeout

解决方案


出现此问题的原因是本地计算机上安装的 Excel 未激活。激活后,问题就解决了。


推荐阅读