[C语言]Excel转换JsonObject

📅 2026/7/4 4:18:44
[C语言]Excel转换JsonObject
要在 C 语言中实现将 Excel 的两列数据x 和 y读取并存储到 JSON 数组JsonArray的对象中需分两步解析 Excel 文件获取 x 和 y 数据构建 JSON 结构存储数据。以下是具体实现方案前提说明Excel 文件解析C 语言无内置 Excel 解析库需借助轻量级库如libxlsxwriter读 / 写.xlsx或libxls读.xls。本文以libxls为例解析.xls 文件。JSON 构建使用 C 语言 JSON 库cJSON轻量、易用构建JsonArray每个元素为包含x和y的JsonObject。环境准备安装libxls解析.xlssudo apt-get install libxls-devLinux或从源码编译。下载cJSON库从GitHub获取cJSON.c和cJSON.h加入项目。实现代码c#include stdio.h #include stdlib.h #include string.h #include xls.h // libxls头文件 #include cJSON.h // cJSON头文件 // 从Excel读取x和y列数据存入JSON数组 cJSON* excelToJson(const char* excelPath) { xlsWorkBook* pWorkbook xls_open(excelPath, UTF-8); // 打开Excel文件 if (pWorkbook NULL) { printf(无法打开Excel文件: %s\n, excelPath); return NULL; } xlsWorkSheet* pWorksheet xls_getWorkSheet(pWorkbook, 0); // 获取第一个工作表 if (pWorksheet NULL) { printf(获取工作表失败\n); xls_close(pWorkbook); return NULL; } xls_parseWorkSheet(pWorksheet); // 解析工作表 // 创建JSON数组存储所有x,y对象 cJSON* jsonArray cJSON_CreateArray(); if (jsonArray NULL) { printf(创建JSON数组失败\n); xls_close_WS(pWorksheet); xls_close(pWorkbook); return NULL; } // 假设Excel第一行为表头x和y从第二行开始读取数据行索引从0开始 int startRow 1; // 数据起始行跳过表头 int maxRow pWorksheet-rows.lastrow; // 最大行索引 int xCol 0; // x列索引假设第一列0-based int yCol 1; // y列索引假设第二列0-based for (int row startRow; row maxRow; row) { // 获取当前行的x和y单元格数据 xlsCell* xCell xls_cell(pWorksheet, row, xCol); xlsCell* yCell xls_cell(pWorksheet, row, yCol); // 跳过空行x或y为空则跳过 if (xCell NULL || yCell NULL || xCell-str NULL || yCell-str NULL) { continue; } // 创建JSON对象存储x和y cJSON* jsonObj cJSON_CreateObject(); cJSON_AddStringToObject(jsonObj, x, xCell-str); // 假设x为字符串如需数值用cJSON_AddNumberToObject cJSON_AddStringToObject(jsonObj, y, yCell-str); // 假设y为字符串同理可改为数值 // 将对象添加到JSON数组 cJSON_AddItemToArray(jsonArray, jsonObj); } // 释放资源 xls_close_WS(pWorksheet); xls_close(pWorkbook); return jsonArray; } int main() { const char* excelPath data.xls; // Excel文件路径 cJSON* jsonArray excelToJson(excelPath); if (jsonArray NULL) { return 1; } // 打印JSON结果可选 char* jsonStr cJSON_Print(jsonArray); if (jsonStr ! NULL) { printf(JSON结果:\n%s\n, jsonStr); free(jsonStr); // 释放cJSON_Print分配的内存 } // 释放JSON数组 cJSON_Delete(jsonArray);在 C 语言中由于其底层特性和丰富的库支持能够解析多种类型的文件具体取决于使用的库和实现方式。以下是 C 语言常见的可解析文件类型及对应的解析方式1.文本文件.txt、.csv、.log 等特点由 ASCII 或 UTF-8 等编码的字符组成结构简单可直接按行或按字符读取。解析方式利用标准库函数fopen、fgets、fscanf等逐行读取通过字符串处理函数strtok、strstr、sscanf等分割内容。例如解析 CSV 文件逗号分隔用fgets读取一行再用strtok按逗号分割字段。示例场景日志文件分析、配置文件如.ini解析。2.二进制文件.bin、.dat 等特点按字节存储数据通常是自定义格式如结构体序列化后的文件需按固定格式解析。解析方式用fread按字节读取通过结构体指针映射数据。例如ctypedef struct { int id; float value; char name[20]; } Data; Data d; FILE* f fopen(data.bin, rb); fread(d, sizeof(Data), 1, f); // 直接读取结构体需知道文件的二进制布局字段类型、顺序、大小端等。3.结构化文本文件.xml、.json 等需第三方库XML可通过libxml2库解析支持 DOM文档对象模型或 SAX事件驱动方式适合处理标签化结构的文件。JSON借助cJSON、json-c等轻量库可解析 JSON 对象、数组支持增删改查节点常用于数据交换格式解析。4.表格文件.xls、.xlsx需特定库.xlsExcel 97-2003可用libxls库解析读取工作表、行、单元格数据文本、数值等支持提取单元格内容和格式信息。.xlsxExcel 2007基于 OOXML 格式ZIP 压缩的 XML 集合需结合libzip解压再用libxml2解析内部...以下是使用 C 实现读取 CSV 文件中 x 和 y 列数据并存储为 JSON 数组每个对象包含 x 和 y 字段的示例代码。代码依赖nlohmann/json库轻量级 JSON 库和 C11 及以上标准实现步骤读取 CSV 文件解析 x 和 y 列数据将每对 (x, y) 封装为 JSON 对象所有对象存入 JSON 数组并输出。代码实现cpp#include iostream #include fstream #include sstream #include string #include nlohmann/json.hpp // 引入nlohmann/json库 using json nlohmann::json; using namespace std; // 从CSV文件读取x和y列返回JSON数组 json csvToJsonArray(const string csvPath) { json jsonArray json::array(); // 定义JSON数组 ifstream file(csvPath); if (!file.is_open()) { cerr 无法打开CSV文件: csvPath endl; return jsonArray; } string line; // 跳过CSV表头假设第一行为列名x,y getline(file, line); // 逐行解析CSV内容 while (getline(file, line)) { stringstream ss(line); string xStr, yStr; // 分割x和y字段假设用逗号分隔 if (getline(ss, xStr, ,) getline(ss, yStr, ,)) { try { // 转换为数值类型根据实际需求可改为字符串 double x stod(xStr); double y stod(yStr); // 创建包含x和y的JSON对象添加到数组 json obj; obj[x] x; obj[y] y; jsonArray.push_back(obj); } catch (const exception e) { cerr 解析CSV行失败: line 错误: e.what() endl; continue; } } } file.close(); return jsonArray; } int main() { // 示例处理包含x和y列的CSV文件 string csvPath data.csv; // CSV文件路径 json result csvToJsonArray(csvPath); // 输出JSON数组格式化打印 cout JSON数组结果:\n result.dump(4) endl; return 0; }依赖与编译依赖库需下载nlohmann/json库单头文件json.hpp无需编译直接包含即可。下载地址https://github.com/nlohmann/json编译命令假设代码文件为csv2json.cpp编译命令bashg -stdc11 csv2json.cpp -o csv2json说明代码假设 CSV 文件格式为第一行为表头x,y后续每行格式为数值,数值如1.2,3.4。如需处理字符串类型的 x/y 数据可移除stod转换直接存储字符串到 JSON 对象。异常处理部分可根据需求扩展如处理空值、格式错误等。运行后CSV 中的 x 和 y 数据将被封装为 JSON 数组例如json[ {x: 1.5, y: 2.8}, {x: 3.2, y: 4.1} ]