Win32 GetIDsOfNames 保存excel
时间: 2023-07-21 22:42:56 浏览: 169
接口调度-WIN32,MFC,COM非常健全的ppt
Win32 GetIDsOfNames 是一种 COM 技术中的方法,用于将一个或多个方法或属性名称转换为其对应的 DISPID(dispatch identifier)。如果您想使用 COM 技术将数据保存到 Excel 文件中,可以考虑使用 Microsoft Office 提供的 Excel COM 对象模型(Excel Object Model)。您可以使用该模型中的 Workbook 和 Worksheet 对象来操作 Excel 文件中的工作簿和工作表。
以下是使用 Excel COM 对象模型保存数据到 Excel 文件的基本步骤:
1. 创建 Excel.Application 对象,并打开 Excel 文件。
2. 获取 Workbook 对象,并选择要写入数据的 Worksheet。
3. 使用 Worksheet 对象提供的 Cells 属性获取要写入数据的单元格。
4. 使用 Range 对象的 Value 属性将数据写入单元格中。
5. 使用 Workbook 对象提供的 SaveAs 方法保存文件。
6. 关闭 Workbook 和 Excel.Application 对象。
以下是一个示例代码:
```cpp
// 初始化 COM
CoInitialize(NULL);
// 创建 Excel.Application 对象
IDispatch* pExcelAppDisp = NULL;
CLSID clsidExcel;
CLSIDFromProgID(L"Excel.Application", &clsidExcel);
HRESULT hr = CoCreateInstance(clsidExcel, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelAppDisp);
// 打开 Excel 文件
VARIANT vFileName;
vFileName.vt = VT_BSTR;
vFileName.bstrVal = SysAllocString(L"C:\\test.xlsx");
VARIANT vReadOnly;
vReadOnly.vt = VT_BOOL;
vReadOnly.boolVal = FALSE;
VARIANT vEmpty;
vEmpty.vt = VT_ERROR;
vEmpty.scode = DISP_E_PARAMNOTFOUND;
IDispatch* pWorkbookDisp = NULL;
hr = pExcelAppDisp->Invoke(0x1c0 /* Workbooks */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &vEmpty, &vFileName, &vReadOnly, &vEmpty, &pWorkbookDisp, NULL, NULL);
// 获取 Worksheet 对象
VARIANT vSheetIndex;
vSheetIndex.vt = VT_I4;
vSheetIndex.lVal = 1;
IDispatch* pWorksheetDisp = NULL;
hr = pWorkbookDisp->Invoke(0x9 /* Worksheets */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &vSheetIndex, &pWorksheetDisp, NULL, NULL);
// 写入数据
VARIANT vCellValue;
vCellValue.vt = VT_BSTR;
vCellValue.bstrVal = SysAllocString(L"Hello, Excel!");
IDispatch* pRangeDisp = NULL;
hr = pWorksheetDisp->Invoke(0xc /* Cells */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &vEmpty, &vEmpty, &vEmpty, &pRangeDisp, NULL, NULL);
hr = pRangeDisp->Invoke(0x3 /* Item */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &vEmpty, &vEmpty, &vEmpty, &pRangeDisp, NULL, NULL);
hr = pRangeDisp->Invoke(0x0 /* Value */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &vCellValue, &vEmpty, NULL, NULL, NULL);
// 保存文件
VARIANT vSaveAsFilename;
vSaveAsFilename.vt = VT_BSTR;
vSaveAsFilename.bstrVal = SysAllocString(L"C:\\test_saved.xlsx");
hr = pWorkbookDisp->Invoke(0x1a6 /* SaveAs */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &vSaveAsFilename, &vEmpty, &vEmpty, &vEmpty, &vEmpty, &vEmpty, NULL);
// 关闭 Workbook 和 Excel.Application 对象
hr = pWorkbookDisp->Invoke(0x115 /* Close */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &vEmpty, &vEmpty, &vEmpty, NULL, NULL, NULL);
hr = pExcelAppDisp->Invoke(0x12e /* Quit */, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &vEmpty, NULL, NULL, NULL, NULL, NULL);
// 释放资源
pWorksheetDisp->Release();
pWorkbookDisp->Release();
pExcelAppDisp->Release();
CoUninitialize();
```
请注意,以上代码仅作为示例,您需要根据实际需求进行修改和扩展。
阅读全文