在C语言中导入Excel表格到数据库是一个常见的需求,通常涉及读取Excel文件数据并将其插入到数据库(如MySQL、SQLite等)中,实现这一过程需要结合Excel文件读取库和数据库操作接口,以下是详细的步骤和代码示例。
选择合适的工具库是关键,对于Excel文件读取,常用的库有libxlsxwriter
(用于写入)、libxls
(用于读取旧版.xls)或OpenXLSX
(现代C++库,但C语言中可通过封装使用),对于数据库操作,MySQL提供了mysqlclient
库,SQLite则提供sqlite3
库,本文以SQLite为例,结合libxlsx
(需先安装)演示完整流程。
步骤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:编译与运行
使用以下命令编译代码(需链接xlsxio
和sqlite3
库):
gcc -o excel_to_db excel_to_db.c -lxlsxio -lsqlite3 ./excel_to_db
注意事项
- 数据类型转换:Excel中的日期、浮点数可能需要额外处理,例如使用
xlsxioread_sheet_next_cell_double
读取数值。 - 错误处理:代码中已包含基本错误处理,实际应用中需更详细(如检查文件是否存在、列数是否匹配等)。
- 性能优化:对于大数据量,可使用事务(
BEGIN TRANSACTION
和COMMIT
)批量插入,减少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
),若为合并单元格则使用主单元格的值填充其他位置。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复