当前位置:首页 > 问答 > 正文

XLSX导入|数据库操作 C语言实现:将XLSX文件读取至数据库,c 读取xlsx到数据库

📊 从Excel到数据库:C语言实现XLSX导入全攻略

场景引入
凌晨3点,你盯着电脑屏幕,手里端着第5杯咖啡☕,老板刚丢给你一个包含10万行销售数据的XLSX文件,要求天亮前全部入库,手动复制粘贴?😱 别慌!用C语言写个自动化工具,让代码替你搞定这场"数据迁徙"!


准备工作 🛠️

需要的工具库

  • libxlsxwriter:轻量级XLSX解析库(2025年最新稳定版v1.1.5)
  • SQLite3:嵌入式数据库(或MySQL客户端库)
  • zlib:处理XLSX的压缩格式
# Ubuntu安装示例
sudo apt-get install libsqlite3-dev libxlsxwriter-dev zlib1g-dev

文件结构预览

XLSX本质是ZIP压缩包,解压后包含:

📁 xl/  
  ├── worksheets/    # 工作表数据  
  ├── sharedStrings.xml  # 共享字符串  
📄 _rels/           # 文件关系定义  
📄 [Content_Types].xml # 内容类型声明

代码实战 💻

读取XLSX核心代码

#include <xlsxio_read.h>
#include <sqlite3.h>
void xlsx_to_db(const char* xlsx_path, const char* db_path) {
    // 打开XLSX文件
    xlsxioreader xlsxioread = xlsxioread_open(xlsx_path);
    if (!xlsxioread) {
        fprintf(stderr, "❌ 文件打开失败\n");
        return;
    }
    // 连接数据库
    sqlite3 *db;
    if (sqlite3_open(db_path, &db) != SQLITE_OK) {
        fprintf(stderr, "❌ 数据库连接失败: %s\n", sqlite3_errmsg(db));
        xlsxioread_close(xlsxioread);
        return;
    }
    // 读取第一个工作表
    xlsxioreadersheet sheet = xlsxioread_sheet_open(xlsxioread, NULL, XLSXIOREAD_SKIP_EMPTY_ROWS);
    if (!sheet) {
        fprintf(stderr, "❌ 工作表读取失败\n");
        sqlite3_close(db);
        xlsxioread_close(xlsxioread);
        return;
    }
    // 创建表(动态获取列名)
    char* header;
    xlsxioread_sheet_next_row(sheet);  // 读取首行作为列名
    while ((header = xlsxioread_sheet_next_cell(sheet)) != NULL) {
        printf("📌 检测到列: %s\n", header);
        free(header);
    }
    // ...(实际数据处理逻辑见下文)
}

数据库操作技巧

// 动态创建表
const char* create_table_sql = "CREATE TABLE IF NOT EXISTS sales_data ("
                              "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                              "product TEXT,"
                              "quantity INT,"
                              "price REAL);";
// 使用预处理语句提升性能
sqlite3_stmt *stmt;
const char* insert_sql = "INSERT INTO sales_data (product, quantity, price) VALUES (?, ?, ?);";
sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL);
// 绑定数据示例
sqlite3_bind_text(stmt, 1, "智能手表", -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, 150);
sqlite3_bind_double(stmt, 3, 299.99);
sqlite3_step(stmt);
sqlite3_reset(stmt);  // 重用语句

避坑指南 ⚠️

  1. 内存泄漏检测
    使用Valgrind检查:

    valgrind --leak-check=full ./your_program
  2. 特殊字符处理

    XLSX导入|数据库操作 C语言实现:将XLSX文件读取至数据库,c 读取xlsx到数据库

    // 替换单引号等SQL敏感字符
    void sanitize_input(char* str) {
        char *p = strchr(str, '\'');
        while (p) {
            *p = '_';  // 简单替换方案
            p = strchr(p+1, '\'');
        }
    }
  3. 性能优化

    • 开启事务批量提交
      sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL);
      // 批量插入...
      sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);

完整流程演示 🎬

  1. 准备测试文件 sales.xlsx
    | 产品 | 销量 | 单价 | |------------|------|-------| | 无线耳机 | 200 | 159.0 | | 智能音箱 | 85 | 299.0 |

  2. 编译运行:

    gcc -o xlsx2db xlsx2db.c -lxlsxio_read -lsqlite3 -lz
    ./xlsx2db sales.xlsx sales.db
  3. 验证结果:

    XLSX导入|数据库操作 C语言实现:将XLSX文件读取至数据库,c 读取xlsx到数据库

    sqlite3 sales.db "SELECT * FROM sales_data;"

扩展思考 💡

  • 大数据量处理:采用分片读取+多线程(建议超过50万行时启用)
  • 异常恢复:记录已处理行号,支持断点续传
  • 格式转换:日期/货币等特殊格式的自动化处理

🚀 最新动态:2025年8月发布的libxlsxio 1.2测试版已支持流式读取,内存占用降低40%!

最后的小幽默
当你的代码成功运行时,记得对Excel文件说:"你的数据很好,现在它是我的了" 😎

(完)

发表评论