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 包在交易中頁面每列產生一個 INSERT,在大量匯入時既慢又不安全。將整段貼入 BEGIN/COMMIT 區塊中,或在將數百列以上搬入正式資料庫時使用引擎的批次載入工具。標題列偵測會走訪所選工作表的第一個非空列,並根據其文字產生 `INSERT INTO ... (col1, col2, ...)`;DATE 儲存格使用 Excel 序號慣例讀取(自 1900-01-01 起的天數,並受 1900 閏年錯誤影響使 3 月 1 日往回移一天,因此 25569 對應 1970-01-01 的 Unix 紀元)。尚未重新計算的公式儲存格會帶有過期的 `.value`,而合併儲存格範圍只暴露左上角的錨點,因此寬幅的合併標題列對解析器來說看起來就像單個 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 已快取的儲存值。如果你需要最新的公式結果,請開啟原始活頁簿、重算、儲存後再重新上傳。