c++获取excel数据
时间: 2023-08-15 08:06:17 浏览: 52
要在 C++ 中获取 Excel 数据,我们可以使用 COM 接口。以下是一个示例代码,可以打开一个 Excel 文件,读取其中的数据并输出到控制台:
```cpp
#include <windows.h>
#include <ole2.h>
#include <iostream>
void read_excel(const wchar_t* filename) {
HRESULT hr;
CoInitialize(NULL);
// 创建 Excel 应用程序对象
IDispatch* pExcelApp = NULL;
hr = CoCreateInstance(CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelApp);
if (FAILED(hr)) {
std::cout << "Failed to create Excel application object!" << std::endl;
return;
}
// 打开 Excel 文件
VARIANT varFilename;
VariantInit(&varFilename);
varFilename.vt = VT_BSTR;
varFilename.bstrVal = SysAllocString(filename);
IDispatch* pWorkbooks = NULL;
hr = pExcelApp->GetTypeInfo()->InvokeMember(L"Workbooks", DISPATCH_PROPERTYGET, NULL, pExcelApp, NULL, &pWorkbooks, NULL, NULL);
if (FAILED(hr)) {
std::cout << "Failed to get Workbooks object!" << std::endl;
pExcelApp->Release();
return;
}
IDispatch* pWorkbook = NULL;
hr = pWorkbooks->GetTypeInfo()->InvokeMember(L"Open", DISPATCH_METHOD, NULL, pWorkbooks, &varFilename, &pWorkbook, NULL, NULL);
if (FAILED(hr)) {
std::cout << "Failed to open Excel file!" << std::endl;
pWorkbooks->Release();
pExcelApp->Release();
return;
}
// 获取第一个工作表
IDispatch* pWorksheets = NULL;
hr = pWorkbook->GetTypeInfo()->InvokeMember(L"Worksheets", DISPATCH_PROPERTYGET, NULL, pWorkbook, NULL, &pWorksheets, NULL, NULL);
if (FAILED(hr)) {
std::cout << "Failed to get Worksheets object!" << std::endl;
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
return;
}
IDispatch* pWorksheet = NULL;
VARIANT varIndex;
VariantInit(&varIndex);
varIndex.vt = VT_I4;
varIndex.lVal = 1;
hr = pWorksheets->GetTypeInfo()->InvokeMember(L"Item", DISPATCH_PROPERTYGET, NULL, pWorksheets, &varIndex, &pWorksheet, NULL, NULL);
if (FAILED(hr)) {
std::cout << "Failed to get first worksheet!" << std::endl;
pWorksheets->Release();
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
return;
}
// 获取数据
IDispatch* pRange = NULL;
hr = pWorksheet->GetTypeInfo()->InvokeMember(L"Range", DISPATCH_PROPERTYGET, NULL, pWorksheet, &varIndex, &pRange, NULL, NULL);
if (FAILED(hr)) {
std::cout << "Failed to get Range object!" << std::endl;
pWorksheet->Release();
pWorksheets->Release();
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
return;
}
VARIANT varValue;
VariantInit(&varValue);
hr = pRange->GetTypeInfo()->InvokeMember(L"Value", DISPATCH_PROPERTYGET, NULL, pRange, NULL, &varValue, NULL, NULL);
if (FAILED(hr)) {
std::cout << "Failed to get cell value!" << std::endl;
pRange->Release();
pWorksheet->Release();
pWorksheets->Release();
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
return;
}
// 输出数据到控制台
SAFEARRAY* pArray = varValue.parray;
long num_rows, num_cols;
SafeArrayGetUBound(pArray, 1, &num_rows);
SafeArrayGetUBound(pArray, 2, &num_cols);
for (long i = 0; i <= num_rows; i++) {
for (long j = 0; j <= num_cols; j++) {
VARIANT varCell;
VariantInit(&varCell);
long indices[2] = { i, j };
SafeArrayGetElement(pArray, indices, &varCell);
std::wcout << varCell.bstrVal << L"\t";
VariantClear(&varCell);
}
std::wcout << std::endl;
}
// 释放资源
VariantClear(&varValue);
pRange->Release();
pWorksheet->Release();
pWorksheets->Release();
pWorkbook->Release();
pWorkbooks->Release();
pExcelApp->Release();
CoUninitialize();
}
int main() {
read_excel(L"C:\\test.xlsx");
return 0;
}
```
这段代码使用了 COM 接口来创建 Excel 应用程序对象,打开 Excel 文件,获取工作表和数据。对于每个单元格,我们可以使用 `SafeArrayGetElement` 函数从数组中获取数据。最后,我们释放所有使用的资源。