[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(解析.xls):sudo apt-get install libxls-dev(Linux)或从源码编译。 - 下载
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)解析。
- 例如解析 CSV 文件(逗号分隔):用
2.二进制文件(.bin、.dat 等)
- 特点:按字节存储数据,通常是自定义格式(如结构体序列化后的文件),需按固定格式解析。
- 解析方式:用
fread按字节读取,通过结构体指针映射数据。例如:c
需知道文件的二进制布局(字段类型、顺序、大小端等)。typedef 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,需特定库)
- .xls(Excel 97-2003):可用
libxls库解析,读取工作表、行、单元格数据(文本、数值等),支持提取单元格内容和格式信息。 - .xlsx(Excel 2007+):基于 OOXML 格式(ZIP 压缩的 XML 集合),需结合
libzip解压,再用libxml2解析内部...
以下是使用 C++ 实现读取 CSV 文件中 x 和 y 列数据,并存储为 JSON 数组(每个对象包含 x 和 y 字段)的示例代码。代码依赖nlohmann/json库(轻量级 JSON 库)和 C++11 及以上标准:
实现步骤
- 读取 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,编译命令:bash
g++ -std=c++11 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} ]