You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C++(Xcode环境)中提取Excel单元格数值并遍历整列

在Xcode的C++项目中提取Excel单元格数值并遍历整列

嘿,刚好我在Xcode环境下用C处理过Excel读取的需求,给你梳理个可行的方案!首先得明确:C本身没有原生支持读取Excel文件的API,所以我们得借助第三方库。我个人推荐xlnt——它是开源跨平台的,对Xcode友好,而且支持.xlsx格式(如果要处理旧版.xls可以考虑libxl,不过它有商业授权限制)。

步骤1:安装xlnt

最简单的方式是用Homebrew在Mac上安装:

brew install xlnt

如果不想用Homebrew,也可以去xlnt的源码仓库下载代码,手动编译后把库文件和头文件导入你的Xcode项目。

步骤2:配置Xcode项目

打开你的C++项目,进入Build Settings:

  • Header Search Paths里添加xlnt的头文件路径(Homebrew安装的话一般是/usr/local/include
  • Library Search Paths里添加库文件路径(Homebrew安装的话是/usr/local/lib
  • 转到Link Binary With Libraries,点击+号,添加libxlnt.dylib

另外记得把项目的C标准设置为C17或更高(xlnt依赖C17的特性),在Build Settings的**C Language Dialect**里选择GNU++17或者Apple Clang++17

步骤3:编写代码提取并遍历整列

下面是完整的示例代码,功能是打开指定Excel文件,遍历A列的所有单元格,提取其中的数字型数值:

#include <xlnt/xlnt.hpp>
#include <iostream>
#include <stdexcept>

int main() {
    // 初始化工作簿对象
    xlnt::workbook excel_workbook;
    
    try {
        // 替换成你的Excel文件路径,注意用绝对路径或者正确的相对路径
        excel_workbook.load("/Users/yourname/Documents/test.xlsx");
    } catch (const std::exception& e) {
        std::cerr << "打开Excel文件出错: " << e.what() << std::endl;
        return EXIT_FAILURE;
    }

    // 获取目标工作表——这里用活跃工作表,也可以用名字指定:excel_workbook.sheet_by_title("Sheet1")
    xlnt::worksheet target_sheet = excel_workbook.active_sheet();

    // 获取该列的最后一行,避免遍历空行
    xlnt::row_t last_row = target_sheet.highest_row();
    std::cout << "当前列共有 " << last_row << " 行数据\n" << std::endl;

    // 遍历A列(xlnt中列索引从1开始,A列就是1)
    for (xlnt::row_t current_row = 1; current_row <= last_row; ++current_row) {
        // 获取当前单元格
        xlnt::cell current_cell = target_sheet.cell(xlnt::column_t(1), current_row);

        // 判断单元格是否为数字类型
        if (current_cell.data_type() == xlnt::cell_type::number) {
            // 提取数值,这里用double类型,也可以根据需求转成int
            double cell_value = current_cell.value<double>();
            std::cout << "第 " << current_row << " 行的数值: " << cell_value << std::endl;
        } else {
            std::cout << "第 " << current_row << " 行不是数字类型,跳过" << std::endl;
        }
    }

    return EXIT_SUCCESS;
}

一些注意事项

  • xlnt只支持.xlsx格式,如果你的文件是.xls(旧版Excel格式),可以考虑使用libxl库,不过它的免费版有功能限制,商业使用需要授权。
  • 确保文件路径正确,Xcode中如果用相对路径,要注意项目的工作目录设置(可以在Scheme的Run选项里设置Working Directory)。
  • 如果单元格里的数字是文本格式(比如带单引号的数字),cell.data_type()会返回xlnt::cell_type::string,这时候你需要手动把字符串转成数字,比如用std::stod()

内容的提问来源于stack exchange,提问作者aleee

火山引擎 最新活动