C语言 Range 遍历Excel表格内容实例
时间: 2024-02-06 13:11:33 浏览: 90
要遍历 Excel 表格内容,可以使用 Microsoft Office 中提供的 COM 接口。COM 接口提供了一系列的 API 用于操作 Excel 应用程序和工作簿,包括遍历工作表中的单元格内容。
下面是一个简单的示例代码,可以遍历 Excel 工作表中所有单元格的内容:
```c
#include <windows.h>
#include <ole2.h>
#include <oleauto.h>
// 遍历 Excel 工作表中所有单元格的内容
void TraverseExcelRange(LPCTSTR szFileName, LPCTSTR szSheetName)
{
HRESULT hr;
IDispatch* pExcelApp = NULL;
IDispatch* pWorkbooks = NULL;
IDispatch* pWorkbook = NULL;
IDispatch* pWorksheets = NULL;
IDispatch* pWorksheet = NULL;
IDispatch* pRange = NULL;
VARIANT varFileName;
VARIANT varSheetName;
VARIANT varRange;
VARIANT varCellValue;
VARIANT varRowIndex;
VARIANT varColumnIndex;
// 初始化 COM
hr = CoInitialize(NULL);
if (FAILED(hr)) {
return;
}
// 创建 Excel 应用程序对象
hr = CoCreateInstance(CLSID_Application, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (LPVOID*)&pExcelApp);
if (FAILED(hr)) {
goto CLEANUP;
}
// 设置 Excel 应用程序为不可见状态
VARIANT varVisible;
varVisible.vt = VT_BOOL;
varVisible.boolVal = VARIANT_FALSE;
hr = pExcelApp->Invoke(0x1f, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &DISPPARAMS{ &VARIANT_TRUE, NULL, 1, 1 }, NULL, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
// 打开 Excel 工作簿
varFileName.vt = VT_BSTR;
varFileName.bstrVal = SysAllocString(szFileName);
hr = pExcelApp->Invoke(0x2e, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &DISPPARAMS{ &varFileName, NULL, 1, 0 }, NULL, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
pWorkbooks = hr;
// 获取 Excel 工作表
varSheetName.vt = VT_BSTR;
varSheetName.bstrVal = SysAllocString(szSheetName);
hr = pWorkbooks->Invoke(0x5d, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &DISPPARAMS{ &varSheetName, NULL, 1, 0 }, NULL, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
pWorkbook = hr;
// 获取 Excel 工作表集合
hr = pWorkbook->Invoke(0x20, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &DISPPARAMS{ NULL, NULL, 0, 0 }, NULL, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
pWorksheets = hr;
// 获取 Excel 工作表的总行数和总列数
pWorksheet = pWorksheets;
hr = pWorksheet->Invoke(0x1b3, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &varRowIndex, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
hr = pWorksheet->Invoke(0x1c0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &varColumnIndex, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
// 遍历 Excel 工作表中所有单元格的内容
for (int i = 1; i <= varRowIndex.lVal; i++) {
for (int j = 1; j <= varColumnIndex.lVal; j++) {
// 获取单元格的范围和值
varRange.vt = VT_BSTR;
varRange.bstrVal = SysAllocStringLen(NULL, 64);
wsprintf(varRange.bstrVal, L"%c%d", j + 64, i);
hr = pWorksheet->Invoke(0x4a, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &DISPPARAMS{ &varRange, NULL, 1, 0 }, NULL, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
pRange = hr;
hr = pRange->Invoke(0x0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &varCellValue, NULL, NULL);
if (FAILED(hr)) {
goto CLEANUP;
}
// 输出单元格的范围和值
printf("Range: %s\nValue: %s\n", OLE2A(varRange.bstrVal), OLE2A(varCellValue.bstrVal));
// 释放资源
if (pRange != NULL) {
pRange->Release();
}
if (varRange.vt == VT_BSTR) {
SysFreeString(varRange.bstrVal);
}
}
}
CLEANUP:
// 释放资源
if (pWorksheets != NULL) {
pWorksheets->Release();
}
if (pWorkbook != NULL) {
pWorkbook->Release();
}
if (pWorkbooks != NULL) {
pWorkbooks->Release();
}
if (pExcelApp != NULL) {
pExcelApp->Release();
}
if (varSheetName.vt == VT_BSTR) {
SysFreeString(varSheetName.bstrVal);
}
if (varFileName.vt == VT_BSTR) {
SysFreeString(varFileName.bstrVal);
}
// 反初始化 COM
CoUninitialize();
}
```
其中,TraverseExcelRange 函数用于遍历 Excel 工作表中所有单元格的内容。需要注意的是,在使用 COM 接口时,需要进行 COM 的初始化和反初始化。
另外,由于涉及到 COM 接口的使用,因此需要在项目的链接器设置中添加 "ole32.lib" 和 "oleaut32.lib" 两个库文件。
阅读全文