Excel 转 SQL 工具
上传 Excel 文件,转换为 SQL INSERT 语句
拖放 Excel 文件到此处,或点击选择文件
什么是 Excel 转 SQL?
Excel 转 SQL 是一个在线数据格式转换工具,可以将 Excel(.xlsx/.xls)文件转换为 SQL INSERT 语句,方便导入数据库。Excel 是最常用的电子表格格式,广泛用于数据存储和分析。SQL 是关系型数据库的标准查询语言,INSERT 语句用于向数据库表中插入数据。使用本工具,您可以快速将 Excel 表格数据转换为可执行的 SQL 语句,支持多工作表选择、自定义表名和引号风格,方便数据迁移和导入操作。
使用方法
使用步骤
- 上传 Excel 文件(.xlsx 或 .xls 格式)
- 如包含多个工作表,请选择要转换的工作表
- 设置表名(默认 table_name)
- 选择是否将第一行作为字段名
- SQL INSERT 语句会自动生成,支持一键复制
SQL 生成检查
- 在将生成的 SQL 投入生产数据库前,请检查列名、数据类型、引号以及 NULL 处理。
- 生产环境导入前,请先在临时表上测试,并保留原始电子表格的备份。
使用场景
技术原理
页面使用 SheetJS 解析上传的工作簿——XLSX.read(arrayBuffer, {type: 'array'}) 返回工作簿对象,其中工作表的单元格以 A1 键索引,然后 XLSX.utils.sheet_to_json(sheet, {header: 1, defval: null}) 遍历有界的 !ref 范围生成二维数组。第一个非空行(启用「首行作为字段名」时)作为列名;否则会生成 SheetJS 风格的 col1、col2、col3。每个后续行输出为一条 SQL 语句 INSERT INTO `table` (`c1`, `c2`, ...) VALUES (v1, v2, ...);,并可选择在前面添加 CREATE TABLE `table` (`c1` VARCHAR(255), ...);。 标识符引用方式因 SQL 方言而异,遵循 SQL:1992 标准及各厂商的偏差实现:标准 SQL 和 PostgreSQL 使用双引号引用标识符("col"),MySQL 和 MariaDB 默认使用反引号(`col`),仅在开启 ANSI_QUOTES SQL 模式时才接受双引号,SQLite 同时接受反引号和双引号(出于向后兼容,双引号标识符若无法解析则被视为字符串字面量——这是 SQLite Quirks 页面中记录的一个常见陷阱),SQL Server 和 Sybase 使用方括号([col])。值引用遵循 SQL 字符串字面量规则:用单引号包裹,内部单引号通过加倍转义('O''Brien'),符合 ISO/IEC 9075 标准。空单元格映射为无引号的字面量 NULL,而非空字符串 '';cell.t === 'n' 的数字单元格不加引号输出;布尔值根据方言转换为 1/0 或 TRUE/FALSE;日期需要特殊处理。 日期单元格需要特别注意,因为 SheetJS 保留了底层的数字序列号:Excel 将日期存储为自 1900-01-01 起的天数,并存在历史性的 1900-02-29 闰年 bug,导致 1900 年 3 月之前的日期偏移一天,而 Excel for Mac 的 1904 系统则使用 1904-01-01 作为纪元。转换为 ISO 8601 格式(YYYY-MM-DD HH:mm:ss,MySQL DATETIME 和 PostgreSQL TIMESTAMP 均接受此格式)的公式为 (serial - 25569) * 86400000 ms(Unix 纪元之后),然后以 UTC 格式化。类型推断是纯词法和浅层的:第一个非空单元格为整数的列推断为 INT,小数推断为 DECIMAL(10,2),文本推断为 VARCHAR(255),以 2024-01-01 开头的列可能被导出为字符串,除非源单元格标记为 cell.t === 'd'。批量插入默认每行一条 INSERT,在数据量大时效率很低;将 100-500 行合并为一条 INSERT INTO t VALUES (...), (...), ...; 可减少约 100 倍的网络往返,将脚本包裹在 BEGIN; ... COMMIT; 中可将导入变为一个原子事务,在第一行失败时整体回滚。
- 标识符引用方言差异:MySQL/MariaDB 使用 `col`(反引号,或开启 ANSI_QUOTES 时使用 "col");PostgreSQL 和标准 SQL 使用 "col";SQL Server 使用 [col];SQLite 两者都接受(但 "col" 在 col 不是已知标识符时会静默回退为字符串字面量)。
- 字符串字面量转义(ISO/IEC 9075):用单引号包裹,内部单引号加倍(O'Brien → 'O''Brien');不要内联原始反斜杠——PostgreSQL 的 standard_conforming_strings 自 9.1 起默认为 on。
- Excel 日期序列号:自 1900-01-01 起的天数,存在 1900-02-29 bug(若 workbook.date1904 为 true 则从 1904-01-01 起算);ISO 8601 字符串 = new Date((serial - 25569) * 86400000).toISOString()。
- 类型推断是词法的:整数 → INT,小数 → DECIMAL(10,2),文本 → VARCHAR(255);看起来像日期但未标记 cell.t === 'd' 的日期会导出为字符串;带千分位分隔符的金额单元格会连同分隔符一起导出到字符串中。
- NULL 处理:空 Excel 单元格变为无引号的字面量 NULL,而非 ''——这对 NOT NULL 列和 COUNT(col) 有重要影响,因为 COUNT 跳过 NULL 但计入 ''。
- 批量插入:将 100-500 行合并为一条 INSERT INTO t VALUES (...),(...),...; 相比每行一条 INSERT 可减少约 100 倍网络往返;MySQL 的 max_allowed_packet(默认 64 MB)限制单条语句大小。
- 将生成的脚本包裹在 BEGIN;...COMMIT;(PostgreSQL/SQLite)或 START TRANSACTION;...COMMIT;(MySQL InnoDB)中,使单行失败时整个批次回滚;MyISAM 表忽略事务,会部分提交。
示例
Excel 工作表 → INSERT 语句
工作表 "users"(3 行):
id | name | email | age
1 | Alice | alice@mail.com | 28
2 | Bob | bob@mail.com | 34
生成的 SQL:
INSERT INTO users (id, name, email, age) VALUES (1, 'Alice', 'alice@mail.com', 28);
INSERT INTO users (id, name, email, age) VALUES (2, 'Bob', 'bob@mail.com', 34);单条多行 INSERT(批量导入更快)
批量导入时使用「合并行」选项:
INSERT INTO products (sku, name, price) VALUES
('A001', 'USB-C Cable', 9.90),
('A002', 'HDMI Adapter', 14.50),
('A003', 'Mouse Pad', 4.25);
3 次往返减少为 1 次——100-500 行批量更稳妥。处理含撇号的姓名转义
源单元格:O'Brien
生成的 SQL(单引号双写转义):
INSERT INTO customers (id, name) VALUES (42, 'O''Brien');
NULL 处理 —— Excel 空单元格会输出为 NULL,而不是 '':
INSERT INTO customers (id, phone) VALUES (43, NULL);用事务包裹导入
BEGIN;
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1001, 7, 199.50, '2026-06-01');
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1002, 7, 42.00, '2026-06-02');
INSERT INTO orders (id, customer_id, total, created_at) VALUES (1003, 9, 78.30, '2026-06-03');
COMMIT;
任意一行失败时整批回滚。常见问题
上传的表格会发到服务器吗?
不会。文件由 SheetJS 在浏览器中解析,SQL 也在本地生成,全程不会发送到服务器,因此即使是敏感数据也只会留在你的设备上。
会生成什么样的 SQL?
先输出一条 CREATE TABLE 语句,然后是逐行的 INSERT INTO 语句(一行数据一条语句)。生成的 SQL 会使用你输入的表名以及你选择的引号风格(单引号、双引号或反引号)。
列的数据类型是怎么推断的?
工具会对每一列采样,选取能容纳所有值的最窄类型:INTEGER、DECIMAL、VARCHAR(N)、BOOLEAN 或 DATE/DATETIME。生成 SQL 之前你可以手动覆盖。混合类型的列会回退为 VARCHAR。
Excel 日期怎么处理?
Excel 把日期存储为序列号。工具会原样输出表格中的值。如果需要适配目标数据库的日期格式,请检查生成的 SQL 并自行调整日期字面量。
特殊字符和引号是如何转义的?
单引号会被加倍转义(Smith's → Smith''s)。反斜杠和 Unicode 字符按字面原样输出——这与 PostgreSQL 标准合规字符串一致。如果你的 MySQL 关闭了 NO_BACKSLASH_ESCAPES,可能需要手动转义反斜杠。
结果能在 MySQL、PostgreSQL、SQLite、MSSQL 上跑吗?
基本的 INSERT 语句在这四种数据库上都能用。CREATE TABLE 语句使用了通用类型(INT、VARCHAR、DECIMAL、DATE)。如果需要方言专用类型(SERIAL、AUTO_INCREMENT、IDENTITY),请自行修改 CREATE 语句。
公式会被求值吗?
不会。使用的是 Excel 保存时缓存的结果值。如果需要最新的公式结果,请打开源文件重新计算并保存,再重新上传。