#include
#include
#include
#include
#include
#import "C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE" rename("RGB", "ExcelRGB")
void read_excel(const char *file_name) {
HRESULT hr;
CLSID clsid;
IDispatch *pXlApp = NULL;
IDispatch *pXlBooks = NULL;
IDispatch *pXlBook = NULL;
IDispatch *pXlSheet = NULL;
IDispatch *pXlRange = NULL;
VARIANT result;
hr = CLSIDFromProgID(OLESTR("Excel.Application"), &clsid);
if (FAILED(hr)) {
printf("CLSIDFromProgID failedn");
return;
}
hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IDispatch, (void )&pXlApp);
if (FAILED(hr)) {
printf("CoCreateInstance failedn");
return;
}
// Make Excel application visible
VariantInit(&result);
result.vt = VT_BOOL;
result.boolVal = VARIANT_TRUE;
hr = pXlApp->lpVtbl->PutProperty(pXlApp, L"Visible", &result);
if (FAILED(hr)) {
printf("Failed to make Excel visiblen");
return;
}
// Get Workbooks collection
VariantInit(&result);
hr = pXlApp->lpVtbl->GetProperty(pXlApp, L"Workbooks", &result);
if (FAILED(hr)) {
printf("Failed to get Workbooks collectionn");
return;
}
pXlBooks = result.pdispVal;
// Open the Excel file
VARIANT vtFileName;
vtFileName.vt = VT_BSTR;
vtFileName.bstrVal = _bstr_t(file_name);
hr = pXlBooks->lpVtbl->Invoke(pXlBooks, L"Open", &vtFileName, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &result);
if (FAILED(hr)) {
printf("Failed to open Excel filen");
return;
}
pXlBook = result.pdispVal;
// Get the first sheet
VariantInit(&result);
hr = pXlBook->lpVtbl->GetProperty(pXlBook, L"Worksheets", &result);
if (FAILED(hr)) {
printf("Failed to get Worksheets collectionn");
return;
}
pXlSheet = result.pdispVal;
VARIANT vtIndex;
vtIndex.vt = VT_I4;
vtIndex.lVal = 1;
hr = pXlSheet->lpVtbl->Invoke(pXlSheet, L"Item", &vtIndex, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &result);
if (FAILED(hr)) {
printf("Failed to get the first sheetn");
return;
}
pXlSheet = result.pdispVal;
// Get the used range
VariantInit(&result);
hr = pXlSheet->lpVtbl->GetProperty(pXlSheet, L"UsedRange", &result);
if (FAILED(hr)) {
printf("Failed to get the used rangen");
return;
}
pXlRange = result.pdispVal;
// Read the range
// (This is a simplified example, you may need to iterate through rows and columns)
VariantInit(&result);
hr = pXlRange->lpVtbl->GetProperty(pXlRange, L"Value", &result);
if (FAILED(hr)) {
printf("Failed to get the range valuen");
return;
}
// Print the value
if (result.vt == (VT_ARRAY | VT_VARIANT)) {
SAFEARRAY *psa = result.parray;
VARIANT *pData;
SafeArrayAccessData(psa, (void )&pData);
printf("Cell[1,1]: %lsn", pData[0].bstrVal);
SafeArrayUnaccessData(psa);
}
// Clean up
pXlRange->lpVtbl->Release(pXlRange);
pXlSheet->lpVtbl->Release(pXlSheet);
pXlBook->lpVtbl->Release(pXlBook);
pXlBooks->lpVtbl->Release(pXlBooks);
pXlApp->lpVtbl->Release(pXlApp);
}
int main() {
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
printf("Failed to initialize COM libraryn");
return 1;
}
const char *file_name = "example.xlsx";
read_excel(file_name);
CoUninitialize();
return 0;
}