c++ - C++ Excel COM 自动化 - Workbook.SaveAs - 未找到成员
问题描述
我们最近注意到我们的 MFC 旧应用程序存在问题,无论我们尝试调用 Workbook.SaveAs,在使用旧版本 Office 的机器上此调用都会失败,而不是我们的开发机器。我想我已经将问题缩小到 Excel 类型库中的更改,在 16.0.4549.1000 和 16.0.9029.2106 之间的某个地方,在 SaveAs 方法中添加了一个新的可选参数。
但是,我很难理解为什么这次更改会影响我们,因为在过去 10 多年中从未对类型库进行过类似的更改。我们使用以下指令进行导入:
// MSO
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" \
no_dual_interfaces \
rename("RGB", "OfficeRGB") \
rename("SearchPath", "OfficeSearchPath")
// VBA
#import "libid:0002E157-0000-0000-C000-000000000046" \
no_dual_interfaces
// Excel
#import "libid:00020813-0000-0000-C000-000000000046" \
no_dual_interfaces \
rename("RGB", "ExcelRGB") \
rename("DialogBox", "ExcelDialogBox") \
rename("CopyFile", "ExcelCopyFile") \
rename("ReplaceText", "ExcelReplaceText")
据我了解,使用“no_dual_interfaces”可以确保生成的包装器方法的所有调用都是通过IDispatch进行的,因此使用后期绑定,这应该正好解决类型库中修改方法的问题。还是我在那个假设中弄错了?
说明问题的示例代码:
// create Excel instance
Excel::_ApplicationPtr excelApp;
excelApp.CreateInstance(_T("Excel.Application"));
// add a new workbook
Excel::WorkbooksPtr workbooks = excelApp->GetWorkbooks();
Excel::_WorkbookPtr workbook = workbooks->Add();
workbook->Activate();
// insert data
// ...
// save the workbook to the temp directory
TCHAR lpTempPath[MAX_PATH];
GetTempPath(MAX_PATH, lpTempPath);
COleVariant filename(CString(lpTempPath) + _T("ExcelAutomation"));
workbook->SaveAs(filename, vtMissing, vtMissing, vtMissing, VARIANT_FALSE, VARIANT_FALSE, Excel::xlNoChange, vtMissing, VARIANT_FALSE);
我们的 SaveAs 调用仅提供已支持多年的参数,所有较新的参数均保持其默认值 vtMissing。无论执行地点使用的确切 Office 版本如何,我们是否期望此调用在所描述的场景中工作时遗漏了什么?
我们直接就这个问题联系了 Microsoft 专业支持,但他们指示我们在 StackOverflow 上询问...
解决方案
推荐阅读
- c# - 将excel导入数据库c#asp.net
- scala - 在不使用反向方法的情况下获取列表的最后两个元素?[斯卡拉]
- powershell - 将删除的文件记录到文本文件
- dialogflow-es - Google Dialogflow:获取卡片的 ID
- r - if_else 真值默认为 NA
- c# - 如何使用 HttpWebRequest 在 POST 请求中发送数据
- java - hasPrevious 的检查元素
- javascript - React Form:Form Input 使用时需要 name 属性
- python - 如何在 matplotlib 中使用自己的 CSV 文件
- leaflet - Leaflet Routing API:检索腿部数据