上一篇
场景引入:
凌晨3点,你盯着电脑屏幕,手里端着第5杯咖啡☕,老板刚丢给你一个包含10万行销售数据的XLSX文件,要求天亮前全部入库,手动复制粘贴?😱 别慌!用C语言写个自动化工具,让代码替你搞定这场"数据迁徙"!
# Ubuntu安装示例 sudo apt-get install libsqlite3-dev libxlsxwriter-dev zlib1g-dev
XLSX本质是ZIP压缩包,解压后包含:
📁 xl/
├── worksheets/ # 工作表数据
├── sharedStrings.xml # 共享字符串
📄 _rels/ # 文件关系定义
📄 [Content_Types].xml # 内容类型声明
#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); // 重用语句
内存泄漏检测
使用Valgrind检查:
valgrind --leak-check=full ./your_program
特殊字符处理
// 替换单引号等SQL敏感字符 void sanitize_input(char* str) { char *p = strchr(str, '\''); while (p) { *p = '_'; // 简单替换方案 p = strchr(p+1, '\''); } }
性能优化
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL); // 批量插入... sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
准备测试文件 sales.xlsx
:
| 产品 | 销量 | 单价 |
|------------|------|-------|
| 无线耳机 | 200 | 159.0 |
| 智能音箱 | 85 | 299.0 |
编译运行:
gcc -o xlsx2db xlsx2db.c -lxlsxio_read -lsqlite3 -lz ./xlsx2db sales.xlsx sales.db
验证结果:
sqlite3 sales.db "SELECT * FROM sales_data;"
🚀 最新动态:2025年8月发布的libxlsxio 1.2测试版已支持流式读取,内存占用降低40%!
最后的小幽默:
当你的代码成功运行时,记得对Excel文件说:"你的数据很好,现在它是我的了" 😎
(完)
本文由 闭凝云 于2025-08-02发表在【云服务器提供商】,文中图片由(闭凝云)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/516564.html
发表评论