C语言 GetIDsOfNames Open Save 保存Excel使用实例
时间: 2023-08-15 13:07:31 浏览: 160
好的,我可以为你提供一个基于 C 语言的 GetIDsOfNames、Open 和 Save 方法的 Excel 使用实例。以下是示例代码:
```c
#include <windows.h>
#include <ole2.h>
#include <olectl.h>
#include <stdio.h>
#include <tchar.h>
int main()
{
HRESULT hr;
CLSID clsid;
IDispatch *pXL = NULL;
DISPID dispidOpen, dispidSaveAs;
// 初始化 COM 库
hr = CoInitialize(NULL);
if (FAILED(hr))
{
printf("COM 初始化失败!\n");
return 1;
}
// 获取 Excel 的 CLSID
hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (FAILED(hr))
{
printf("获取 Excel 的 CLSID 失败!\n");
CoUninitialize();
return 1;
}
// 创建 Excel 对象
hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IDispatch, (void **)&pXL);
if (FAILED(hr))
{
printf("创建 Excel 对象失败!\n");
CoUninitialize();
return 1;
}
// 获取 Open 方法的 DISPID
OLECHAR *openName = L"Open";
hr = pXL->lpVtbl->GetIDsOfNames(pXL, &IID_NULL, &openName, 1, LOCALE_USER_DEFAULT, &dispidOpen);
if (FAILED(hr))
{
printf("获取 Open 方法的 DISPID 失败!\n");
pXL->lpVtbl->Release(pXL);
CoUninitialize();
return 1;
}
// 获取 SaveAs 方法的 DISPID
OLECHAR *saveAsName = L"SaveAs";
hr = pXL->lpVtbl->GetIDsOfNames(pXL, &IID_NULL, &saveAsName, 1, LOCALE_USER_DEFAULT, &dispidSaveAs);
if (FAILED(hr))
{
printf("获取 SaveAs 方法的 DISPID 失败!\n");
pXL->lpVtbl->Release(pXL);
CoUninitialize();
return 1;
}
// 构造参数
VARIANT varFileName;
VariantInit(&varFileName);
varFileName.vt = VT_BSTR;
varFileName.bstrVal = SysAllocString(L"C:\\MyExcelFile.xlsx");
VARIANT varReadOnly;
VariantInit(&varReadOnly);
varReadOnly.vt = VT_BOOL;
varReadOnly.boolVal = VARIANT_FALSE;
// 调用 Open 方法
DISPPARAMS dispParamsOpen = {&varFileName, NULL, 0, 0};
VARIANT varWorkbooks;
VariantInit(&varWorkbooks);
hr = pXL->lpVtbl->Invoke(pXL, dispidOpen, &IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParamsOpen, NULL, NULL, &varWorkbooks);
if (FAILED(hr))
{
printf("调用 Open 方法失败!\n");
VariantClear(&varFileName);
VariantClear(&varReadOnly);
pXL->lpVtbl->Release(pXL);
CoUninitialize();
return 1;
}
// 获取 Workbooks 对象
IDispatch *pWorkbooks = varWorkbooks.pdispVal;
// 获取 SaveAs 方法的参数
DISPPARAMS dispParamsSave = {NULL, NULL, 0, 0};
VARIANT varFileNameSave;
VariantInit(&varFileNameSave);
varFileNameSave.vt = VT_BSTR;
varFileNameSave.bstrVal = SysAllocString(L"C:\\MyExcelFileSaved.xlsx");
VARIANT varFileFormat;
VariantInit(&varFileFormat);
varFileFormat.vt = VT_I4;
varFileFormat.lVal = xlOpenXMLWorkbook;
VARIANT varCreateBackup;
VariantInit(&varCreateBackup);
varCreateBackup.vt = VT_BOOL;
varCreateBackup.boolVal = VARIANT_FALSE;
// 调用 SaveAs 方法
DISPPARAMS dispParamsSaveAs = {&varFileNameSave, &varFileFormat, &varCreateBackup, NULL};
hr = pWorkbooks->lpVtbl->Invoke(pWorkbooks, dispidSaveAs, &IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParamsSaveAs, NULL, NULL, NULL);
if (FAILED(hr))
{
printf("调用 SaveAs 方法失败!\n");
VariantClear(&varFileNameSave);
VariantClear(&varFileFormat);
VariantClear(&varCreateBackup);
pWorkbooks->lpVtbl->Release(pWorkbooks);
VariantClear(&varWorkbooks);
VariantClear(&varFileName);
VariantClear(&varReadOnly);
pXL->lpVtbl->Release(pXL);
CoUninitialize();
return 1;
}
// 释放资源
VariantClear(&varFileNameSave);
VariantClear(&varFileFormat);
VariantClear(&varCreateBackup);
pWorkbooks->lpVtbl->Release(pWorkbooks);
VariantClear(&varWorkbooks);
VariantClear(&varFileName);
VariantClear(&varReadOnly);
pXL->lpVtbl->Release(pXL);
CoUninitialize();
return 0;
}
```
这段代码使用了 OLE 自动化技术,通过 GetIDsOfNames 方法获取 Open 和 SaveAs 方法的 DISPID,然后通过 Invoke 方法调用 Open 方法打开 Excel 文件,再通过 Invoke 方法调用 SaveAs 方法将 Excel 文件另存为指定路径。
需要注意的是,这段代码中的 xlOpenXMLWorkbook 是一个 Excel 文件格式常量,可以在 Excel 开发文档中查找到。如果需要保存为其他格式,可以替换为其他常量。
希望这个例子对你有帮助!
阅读全文