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'})` 傳回一個 workbook 物件,其工作表中的儲存格以 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 說明文件中記錄的已知陷阱),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 閏年錯誤,使 1900 年 3 月前的日期偏移一天;Excel for Mac 的 1904 系統則以 1904-01-01 為紀元。轉換為 ISO 8601(YYYY-MM-DD HH:mm:ss,MySQL DATETIME 和 PostgreSQL TIMESTAMP 皆接受的格式)的公式為 `(serial - 25569) * 86400000` 毫秒(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 閏年錯誤(若 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)(跳過 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 標準字串的規範。如果你的目標是停用 NO_BACKSLASH_ESCAPES 的 MySQL,可能需要手動跳脫反斜線。
結果在 MySQL、PostgreSQL、SQLite、MSSQL 上都能用嗎?
基本的 INSERT 在四種資料庫上都能跑。CREATE TABLE 採用可攜的型別(INT、VARCHAR、DECIMAL、DATE)。若要使用方言專屬型別(SERIAL、AUTO_INCREMENT、IDENTITY),請自行修改 CREATE 陳述式以符合目標資料庫。
公式會被計算嗎?
不會。我們只使用 Excel 已快取的儲存值。如果你需要最新的公式結果,請開啟原始活頁簿、重算、儲存後再重新上傳。