excel - 通过 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中做了如下两个测试项目:
EADLL,这是一个 MFC DLL。它包含一个 TestExcel 函数,该函数将自动执行 Excel 2010 并调用 SaveAs 将 Excel 文件保存为 .xlsx 文件格式。如果让睡眠时间达到 15 分钟,则会发生异常。
EAApp,这是一个基于对话框的应用程序来调用 DLL。
我在 Windows 7 Ultimate(带 SP1)64 位版本上重新测试 EADLL 和 EAApp,并确认睡眠 15 分钟时会出现错误。
EADLL 和 EAApp 均已压缩,可从以下位置下载:
https://www.dropbox.com/s/6btgglnt9znadwp/EA.zip?dl=0
谢谢
解决方案
出现此问题的原因是本地计算机上安装的 Excel 未激活。激活后,问题就解决了。
推荐阅读
- c++ - 为什么我们需要在引用右值函数参数上显式调用 std::move ?
- lattice-diamond - Linux 上的 Lattice Diamond v 3.11:ftdio_sio 的问题
- android - Android Q 保存的 Uris 在新手机上是否有效?
- angular - Angular 7 - 自定义烤面包机不显示消息
- javascript - 不能让我的方法连接 2 个值
- java - 如何在 Janusgraph 中进化模式?
- php - 在 Wordpress 中添加多个自定义帖子类型
- scala - 使用 Spark / Scala 根据列值减少组中的行
- angular - 如何在 rxjs 中停止可观察的共享
- angular - 对于我的应用程序中的特定页面并且仅在特定的笔记本电脑中,我得到 net::err_aborted 404 角度