Открытие документа Excel с помощью C ++ MFC OLE-автоматизации показывает конфликт имен ("_FilterDatabase"), тогда как аналогичный подход в C # .NET через Microsoft.Office.Interop.Excel этого не делает.
В моем C ++ MFCПроект автоматизации OLE Я импортировал библиотеку типов для excel.exe и выбрал интерфейсы _Applicatin (CExcelApplication), _Workbook (CWorkbook) и Workbooks (CWorkbooks).
В моем проекте C # .NET я добавил ссылку на COM«Библиотека объектов Microsoft Excel 16.0».
Это код, который я использую в проекте автоматизации CLE MFC OLE:
void OpenExcelDocument(const std::wstring& strDocument)
{
// Create Excel object and bring Excel to the screen
CExcelApplication appExcel;
appExcel.CreateDispatch(L"Excel.Application");
appExcel.put_Visible(TRUE);
// obtain the Workbooks interface
LPDISPATCH pDispWorkbooks = appExcel.get_Workbooks();
if (pDispWorkbooks == NULL)
return;
CExcelWorkbooks workbooks;
workbooks.AttachDispatch(pDispWorkbooks);
// setup the default parameters
VARIANT varDefault;
memset(&varDefault, 0, sizeof(varDefault));
varDefault.vt = VT_ERROR;
varDefault.scode = DISP_E_PARAMNOTFOUND;
// open the document
workbooks.Open(strDocument.c_str(),
varDefault, varDefault, varDefault, varDefault, varDefault, varDefault, varDefault, varDefault,
varDefault, varDefault, varDefault, varDefault, varDefault, varDefault);
}
Следующий код демонстрирует аналогичный подход через C # .NET
using Excel = Microsoft.Office.Interop.Excel;
namespace ReadExcelDoc
{
class Program
{
static void OpenExcelDocument(String strDocument)
{
Excel.Application xlApp = new Excel.Application();
xlApp.Visible = true;
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(strDocument);
}
static void Main(string[] args)
{
String xlsFile = @"...";
OpenExcelDocument(xlsFile);
}
}
}
Мои вопросы:
- Действительно ли это внутренне такой же подход для COM-объектов Excel?
- Есть ли способ избежать запроса Excel наразрешить конфликт имен в моем подходе автоматизации CLE MFC OLE, несмотря на ручное изменение документа Excel?
- Являются ли мои аргументы VARIANT по умолчанию в спецификации C ++правильно уволен?