Excel to 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が生成されます。残りの各行はINSERT INTO `table`(`c1`、`c2`、...)VALUES(v1、v2、...);形式の単一SQLステートメントとして出力され、オプションで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'→'O''Brien')。ISO/IEC 9075準拠。空セルは引用符なしのNULLリテラルにマッピングされます(空文字列''ではありません)。cell.t==='n'の数値セルは引用符なしで出力され、ブール値は方言に応じて1/0またはTRUE/FALSEとなり、日付は明示的な処理が必要です。 日付セルは特別な注意が必要です。SheetJSは基礎となる数値シリアルを保持するためです。Excelは1900-01-01からの日数として日付を格納し、歴史的な1900-02-29のうるう年バグにより1900年3月以前の日付が1日ずれます。Excel for Macの1904システムでは1904-01-01がエポックです。ISO 8601(YYYY-MM-DD HH:mm:ss。MySQL DATETIMEとPostgreSQL TIMESTAMP両方が受け付ける形式)への変換は、Unixエポックからのシリアル-25569×86400000ミリ秒で、UTCでフォーマットされます。型推定は純粋に字句的で浅く、最初の非空セルが整数の列はINT、小数はDECIMAL(10,2)、テキストはVARCHAR(255)となり、2024-01-01で始まる列はソースセルがcell.t==='d'を持たない限り文字列としてエクスポートされます。バルクインサートは1行ごとに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以降デフォルトでオン。
- 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列やNULLをスキップして''をカウントするCOUNT(col)にとってこの違いは重要。
- バルクインサート:100〜500行を単一のINSERT INTO t VALUES(...),(...),...;にまとめると、1行あたり1INSERTと比較してネットワーク往復が約100倍削減。MySQLのmax_allowed_packet(デフォルト64MB)がステートメントサイズの上限となる。
- 生成スクリプトをBEGIN;...COMMIT;(PostgreSQL/SQLite)またはSTART TRANSACTION;...COMMIT;(MySQL InnoDB)で囲むことで、1行の失敗がバッチ全体をロールバック。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;
途中で 1 行でも失敗するとバッチ全体がロールバックされる。よくある質問
スプレッドシートはアップロードされますか?
いいえ。ファイルは SheetJS を介してブラウザ内で解析され、SQL もローカルで生成されます。サーバーには何も送信されないため、機密データであってもデバイス上に留まります。
どのような SQL が出力されますか?
CREATE TABLE 文に続いて、各行ごとの INSERT INTO 文(1 行 1 ステートメント)が出力されます。生成される 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 文は 4 つすべてで動作します。CREATE TABLE 文では移植性のある型(INT、VARCHAR、DECIMAL、DATE)を使用しています。方言固有の型(SERIAL、AUTO_INCREMENT、IDENTITY)が必要な場合は、対象に合わせて CREATE 文を編集してください。
数式は評価されますか?
いいえ。Excel が保存したキャッシュ値が使用されます。最新の数式結果が必要な場合は、元のワークブックを開き、再計算して保存してから再度アップロードしてください。