ToolAct工具行动

Excel 转 SQL 工具

上传 Excel 文件,转换为 SQL INSERT 语句

拖放 Excel 文件到此处,或点击选择文件

什么是 Excel 转 SQL?

Excel 转 SQL 是一个在线数据格式转换工具,可以将 Excel(.xlsx/.xls)文件转换为 SQL INSERT 语句,方便导入数据库。Excel 是最常用的电子表格格式,广泛用于数据存储和分析。SQL 是关系型数据库的标准查询语言,INSERT 语句用于向数据库表中插入数据。使用本工具,您可以快速将 Excel 表格数据转换为可执行的 SQL 语句,支持多工作表选择、自定义表名和引号风格,方便数据迁移和导入操作。

使用方法

使用步骤

  1. 上传 Excel 文件(.xlsx 或 .xls 格式)
  2. 如包含多个工作表,请选择要转换的工作表
  3. 设置表名(默认 table_name)
  4. 选择是否将第一行作为字段名
  5. SQL INSERT 语句会自动生成,支持一键复制

SQL 生成检查

  • 在将生成的 SQL 投入生产数据库前,请检查列名、数据类型、引号以及 NULL 处理。
  • 生产环境导入前,请先在临时表上测试,并保留原始电子表格的备份。

使用场景

从选定的工作表生成 SQL 语句上传 Excel 文件,选择工作表,设置表名,然后根据表头名称或自动生成的 col1、col2、col3 列名生成 INSERT 语句。整个流程在设备上完成,源表格内容不会离开浏览器,这对于处理内部价格表、人事数据或不应离开笔记本的暂存快照很有帮助。
为草稿脚本匹配目标数据库的标识符引号在反引号、双引号和单引号之间切换表名和列名的引号风格,还可以选择是否包含简单的 VARCHAR(255) CREATE TABLE 语句。所有解析和 SQL 生成都在本地进行,草稿脚本可以在执行前先检查列名、数据类型和引号处理是否正确。
准备本地种子数据时注意局限性转换器将单元格值保留为 SQL 字符串或 NULL,并对单引号进行转义,但不会推断数据类型、约束、索引、日期语义、事务或批量加载语法。请将输出视为种子数据的草稿,而非最终的迁移方案。
为目标关系型数据库选择合适的引号风格MySQL 和 SQLite 使用反引号,PostgreSQL 使用双引号,SQL Server 使用方括号;在下拉菜单中选择匹配的风格,使生成的脚本能在目标控制台中直接运行而无需手动修改。注意 SQLite 在没有 DUAL 列上下文时会将双引号标识符当作字符串字面量处理,因此安全的跨方言默认做法是值使用单引号、表名/列名使用反引号或方括号。类型推断也是纯词法的:第一个非空单元格为 1、2、3 的列会被推为 INT,以 2024-01-01 开头的列即使看起来像日期也会被导出为字符串,带千分位分隔符的金额单元格会连同分隔符一起被导出到字符串中。
在事务中包裹多行插入页面每行生成一条 INSERT,对于大批量导入来说既慢又不安全。将整个代码块粘贴到 BEGIN/COMMIT 之间,或在向线上数据库导入数百行以上时使用数据库引擎的批量加载工具。表头行检测会遍历所选工作表的第一个非空行,根据其文本生成 `INSERT INTO ... (col1, col2, ...)` 语句;DATE 类型单元格使用 Excel 序列号规则读取(自 1900-01-01 起的天数,因 1900 年闰年 bug 导致 3 月 1 日回退一天,所以 25569 对应 1970-01-01 的 Unix 纪元)。未重新计算的公式单元格携带过期的 `.value`,合并单元格区域只暴露左上角锚点,因此一个宽幅合并标题行在解析器看来就是一个 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 保存时缓存的结果值。如果需要最新的公式结果,请打开源文件重新计算并保存,再重新上传。