C语言如何将Excel表格数据导入数据库?

在C语言中导入Excel表格到数据库是一个常见的需求,通常涉及读取Excel文件数据并将其插入到数据库(如MySQL、SQLite等)中,实现这一过程需要结合Excel文件读取库和数据库操作接口,以下是详细的步骤和代码示例。

选择合适的工具库是关键,对于Excel文件读取,常用的库有libxlsxwriter(用于写入)、libxls(用于读取旧版.xls)或OpenXLSX(现代C++库,但C语言中可通过封装使用),对于数据库操作,MySQL提供了mysqlclient库,SQLite则提供sqlite3库,本文以SQLite为例,结合libxlsx(需先安装)演示完整流程。

c 怎么导入excel表格数据库数据库中

步骤1:安装必要的库

  • SQLite3:大多数Linux系统自带,Windows可从官网下载预编译库。
  • libxlsx:用于读取.xlsx文件,需从GitHub克隆源码并编译安装,或使用包管理器(如apt install libxlsx-dev)。

步骤2:编写C代码实现导入

以下是完整的代码示例,功能包括打开Excel文件、逐行读取数据并插入SQLite数据库:

#include <stdio.h>
#include <stdlib.h>
#include <xlsxio_read.h>
#include <sqlite3.h>
int main() {
    const char* excel_file = "data.xlsx";
    const char* db_file = "test.db";
    const char* sheet_name = "Sheet1";
    // 初始化SQLite数据库
    sqlite3* db;
    if (sqlite3_open(db_file, &db) != SQLITE_OK) {
        fprintf(stderr, "无法打开数据库: %sn", sqlite3_errmsg(db));
        return 1;
    }
    // 创建表(假设Excel有id, name, age三列)
    const char* create_table_sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT, age INTEGER);";
    if (sqlite3_exec(db, create_table_sql, NULL, NULL, NULL) != SQLITE_OK) {
        fprintf(stderr, "创建表失败: %sn", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    // 使用xlsxio读取Excel
    xlsxioreader xlsxioread;
    xlsxioread = xlsxioread_open(excel_file, XLSXIOREAD_SKIP_EMPTY_ROWS);
    if (!xlsxioread) {
        fprintf(stderr, "无法打开Excel文件n");
        sqlite3_close(db);
        return 1;
    }
    // 获取工作表
    xlsxioworksheet worksheet = xlsxioread_sheet_open(xlsxioread, sheet_name, NULL, NULL, NULL);
    if (!worksheet) {
        fprintf(stderr, "无法打开工作表n");
        xlsxioread_close(xlsxioread);
        sqlite3_close(db);
        return 1;
    }
    // 逐行读取数据并插入数据库
    char* value;
    int row = 0;
    sqlite3_stmt* stmt;
    const char* insert_sql = "INSERT INTO users (id, name, age) VALUES (?, ?, ?);";
    if (sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL) != SQLITE_OK) {
        fprintf(stderr, "准备SQL语句失败: %sn", sqlite3_errmsg(db));
        xlsxioread_sheet_close(worksheet);
        xlsxioread_close(xlsxioread);
        sqlite3_close(db);
        return 1;
    }
    while (xlsxioread_sheet_next_row(worksheet)) {
        row++;
        if (row == 1) continue; // 跳过表头
        // 读取三列数据
        int id = 0;
        char name[50] = {0};
        int age = 0;
        if (xlsxioread_sheet_next_cell_string(worksheet, &value)) {
            sprintf(name, "%s", value);
            free(value);
        }
        if (xlsxioread_sheet_next_cell_integer(worksheet, &id)) {}
        if (xlsxioread_sheet_next_cell_integer(worksheet, &age)) {}
        // 绑定参数并执行插入
        sqlite3_bind_int(stmt, 1, id);
        sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);
        sqlite3_bind_int(stmt, 3, age);
        if (sqlite3_step(stmt) != SQLITE_DONE) {
            fprintf(stderr, "插入数据失败: %sn", sqlite3_errmsg(db));
        }
        sqlite3_reset(stmt);
    }
    // 释放资源
    sqlite3_finalize(stmt);
    xlsxioread_sheet_close(worksheet);
    xlsxioread_close(xlsxioread);
    sqlite3_close(db);
    printf("成功导入%d行数据到数据库n", row - 1);
    return 0;
}

步骤3:编译与运行

使用以下命令编译代码(需链接xlsxiosqlite3库):

c 怎么导入excel表格数据库数据库中

gcc -o excel_to_db excel_to_db.c -lxlsxio -lsqlite3
./excel_to_db

注意事项

  1. 数据类型转换:Excel中的日期、浮点数可能需要额外处理,例如使用xlsxioread_sheet_next_cell_double读取数值。
  2. 错误处理:代码中已包含基本错误处理,实际应用中需更详细(如检查文件是否存在、列数是否匹配等)。
  3. 性能优化:对于大数据量,可使用事务(BEGIN TRANSACTIONCOMMIT)批量插入,减少IO操作。

相关问答FAQs

Q1: 如果Excel文件包含日期格式,如何在C语言中正确读取?
A1: 日期在Excel中通常存储为序列数字(如44197代表2021-01-01),可使用xlsxioread_sheet_next_cell_double读取数值,再通过编程语言内置函数(如mktime或自定义转换)转换为日期格式,在SQLite中可存储为TEXT类型(”YYYY-MM-DD”)或INTEGER(Unix时间戳)。

Q2: 如何处理Excel文件中的空行或合并单元格?
A2: 空行可通过XLSXIOREAD_SKIP_EMPTY_ROWS选项跳过;合并单元格需额外处理逻辑,例如记录合并范围并填充数据,在读取时,可检查单元格是否为合并单元格(通过xlsxioread_cell_get_merged),若为合并单元格则使用主单元格的值填充其他位置。

c 怎么导入excel表格数据库数据库中

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!

(0)
热舞的头像热舞
上一篇 2025-09-16 13:13
下一篇 2024-06-28 14:36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

QQ-14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信