C语言 Range 遍历Excel表格内容实例

时间: 2024-02-06 20:11:33 浏览: 26
要遍历 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" 两个库文件。

相关推荐

最新推荐

recommend-type

c语言读取txt文件内容简单实例

在本篇文章里小编给大家整理的是关于c语言如何读取txt文件内容,需要的朋友们可以参考下。
recommend-type

C语言实现进制转换函数的实例详解

主要介绍了C语言实现进制转换函数的实例详解的相关资料,这里提供实现实例帮助大家实现改功能,需要的朋友可以参考下
recommend-type

C语言模拟实现atoi函数的实例详解

主要介绍了C语言模拟实现atoi函数的实例详解的相关资料,atoi函数,主要功能是将一个字符串转变为整数,这里就实现这样的函数,需要的朋友可以参考下
recommend-type

C语言 经典题目螺旋矩阵 实例详解

主要介绍了C语言 经典题目螺旋矩阵 实例详解的相关资料,这里附有代码实例及实现效果图,需要的朋友可以参考下
recommend-type

C语言接口与实现方法实例详解

主要介绍了C语言接口与实现方法,包括接口的概念、实现方法及抽象数据类型等,并配合实例予以说明,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。