#include
#include
#include
#include
void read_excel(const wchar_t *filename) {
HRESULT hr;
CLSID clsid;
IDispatch *pXlApp = NULL, *pXlBooks = NULL, *pXlBook = NULL, *pXlSheet = NULL;
VARIANT result, param;
CoInitialize(NULL);
// 获取 Excel 应用程序的 CLSID
hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (FAILED(hr)) {
printf("Failed to get CLSID!n");
return;
}
// 创建 Excel 应用程序实例
hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IDispatch, (void)&pXlApp);
if (FAILED(hr)) {
printf("Failed to create Excel instance!n");
return;
}
// 获取 Workbooks 集合
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
if (FAILED(hr)) {
printf("Failed to get Workbooks collection!n");
pXlApp->lpVtbl->Release(pXlApp);
return;
}
pXlBooks = result.pdispVal;
// 打开 Excel 文件
param.vt = VT_BSTR;
param.bstrVal = SysAllocString(filename);
hr = AutoWrap(DISPATCH_METHOD, &result, pXlBooks, L"Open", 1, param);
SysFreeString(param.bstrVal);
if (FAILED(hr)) {
printf("Failed to open Excel file!n");
pXlBooks->lpVtbl->Release(pXlBooks);
pXlApp->lpVtbl->Release(pXlApp);
return;
}
pXlBook = result.pdispVal;
// 获取第一个工作表
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBook, L"Worksheets", 0);
if (FAILED(hr)) {
printf("Failed to get Worksheets collection!n");
pXlBook->lpVtbl->Release(pXlBook);
pXlBooks->lpVtbl->Release(pXlBooks);
pXlApp->lpVtbl->Release(pXlApp);
return;
}
IDispatch *pXlSheets = result.pdispVal;
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheets, L"Item", 1, 1);
pXlSheets->lpVtbl->Release(pXlSheets);
if (FAILED(hr)) {
printf("Failed to get Worksheet!n");
pXlBook->lpVtbl->Release(pXlBook);
pXlBooks->lpVtbl->Release(pXlBooks);
pXlApp->lpVtbl->Release(pXlApp);
return;
}
pXlSheet = result.pdispVal;
// 获取单元格内容
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Cells", 2, 1, 1);
pXlSheet->lpVtbl->Release(pXlSheet);
if (FAILED(hr)) {
printf("Failed to get Cell!n");
pXlBook->lpVtbl->Release(pXlBook);
pXlBooks->lpVtbl->Release(pXlBooks);
pXlApp->lpVtbl->Release(pXlApp);
return;
}
IDispatch *pXlCell = result.pdispVal;
hr = AutoWrap(DISPATCH_PROPERTYGET, &result, pXlCell, L"Value", 0);
pXlCell->lpVtbl->Release(pXlCell);
if (FAILED(hr)) {
printf("Failed to get Cell value!n");
} else {
wprintf(L"Cell value: %sn", result.bstrVal);
SysFreeString(result.bstrVal);
}
// 关闭 Excel 文件
hr = AutoWrap(DISPATCH_METHOD, &result, pXlBook, L"Close", 0);
pXlBook->lpVtbl->Release(pXlBook);
pXlBooks->lpVtbl->Release(pXlBooks);
pXlApp->lpVtbl->Release(pXlApp);
CoUninitialize();
}
int main() {
read_excel(L"test.xlsx");
return 0;
}