C语言 DISPID_WORKBOOKS_OPEN 打开excel表格 读取表格内容
时间: 2023-07-31 09:11:02 浏览: 123
DISPID_WORKBOOKS_OPEN 是一个宏定义,用于表示 Excel 应用程序中的 WorkbookOpen 事件。要在 C 语言中打开 Excel 表格并读取表格内容,可以使用 Microsoft Excel 自带的 COM 接口。
以下是简单的代码示例:
```c
// 引入必要的头文件
#include <windows.h>
#include <ole2.h>
#include <ocidl.h>
#include <oaidl.h>
// 定义 Excel 应用程序的 CLSID 和 IID
const CLSID CLSID_Application = {0x00024500, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
const IID IID_Application = {0x000208D5, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
int main() {
HRESULT hr;
// 初始化 COM 环境
CoInitialize(NULL);
// 创建 Excel 应用程序对象
IDispatch *pExcelApp;
hr = CoCreateInstance(&CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, &IID_Application, (void**)&pExcelApp);
if (FAILED(hr)) {
return -1;
}
// 获取 Workbooks 对象
IDispatch *pWorkbooks;
VARIANT result;
VariantInit(&result);
DISPPARAMS paramsNoArgs = {NULL, NULL, 0, 0};
hr = pExcelApp->Invoke(DISPID_WORKBOOKS, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, ¶msNoArgs, &result, NULL, NULL);
if (FAILED(hr)) {
pExcelApp->Release();
return -1;
}
pWorkbooks = result.pdispVal;
// 打开 Excel 文件
VARIANT vtFileName;
VariantInit(&vtFileName);
vtFileName.vt = VT_BSTR;
vtFileName.bstrVal = SysAllocString(L"D:\\test.xlsx");
IDispatch *pWorkbook;
hr = pWorkbooks->Invoke(DISPID_WORKBOOKS_OPEN, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶msNoArgs, &result, NULL, NULL);
if (FAILED(hr)) {
pWorkbooks->Release();
pExcelApp->Release();
return -1;
}
pWorkbook = result.pdispVal;
// 获取 ActiveSheet 对象
IDispatch *pActiveSheet;
hr = pWorkbook->Invoke(DISPID_WORKBOOK_ACTIVESHEET, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, ¶msNoArgs, &result, NULL, NULL);
if (FAILED(hr)) {
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
return -1;
}
pActiveSheet = result.pdispVal;
// 读取单元格内容
VARIANT vtCell;
VariantInit(&vtCell);
vtCell.vt = VT_BSTR;
vtCell.bstrVal = SysAllocString(L"A1");
hr = pActiveSheet->Invoke(DISPID_VALUE, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, ¶msNoArgs, &result, NULL, NULL);
if (FAILED(hr)) {
pActiveSheet->Release();
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
return -1;
}
vtCell = result;
wprintf(L"Cell Value: %s\n", vtCell.bstrVal);
// 释放资源
VariantClear(&vtCell);
pActiveSheet->Release();
VariantClear(&result);
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
// 反初始化 COM 环境
CoUninitialize();
return 0;
}
```
注意:在使用 COM 接口时需要注意内存管理,以免出现内存泄漏等问题。此外,在使用 BSTR 类型时,需要使用 SysAllocString 和 SysFreeString 来分配和释放内存。
阅读全文