Excel-zu-SQL-Konverter
Excel-Datei hochladen, um sie in SQL-INSERT-Anweisungen zu konvertieren
Excel-Datei hier ablegen oder klicken, um eine Datei auszuwählen
Was ist Excel zu SQL?
Excel zu SQL ist ein Online-Datenformatkonvertierungstool, das Excel-Dateien (.xlsx/.xls) in SQL-INSERT-Anweisungen konvertiert, um den Import in Datenbanken zu erleichtern.
Excel ist das am häufigsten verwendete Tabellenkalkulationsformat, das weit verbreitet für Datenspeicherung und -analyse verwendet wird. SQL ist die standardmäßige Abfragesprache für relationale Datenbanken, und INSERT-Anweisungen werden verwendet, um Daten in Datenbanktabellen einzufügen.
Mit diesem Tool können Sie Excel-Tabellendaten schnell in ausführbare SQL-Anweisungen konvertieren. Es unterstützt die Auswahl mehrerer Tabellenblätter, benutzerdefinierte Tabellennamen und Anführungszeichen-Stile für einfache Datenmigration und Importvorgänge.
Besonders bei produktiven Daten oder Codebasen sollte das Ergebnis anschließend mit Parser, Tests oder Projektregeln geprüft werden.
So geht's
So geht's
- Laden Sie eine Excel-Datei hoch (.xlsx oder .xls)
- Sind mehrere Tabellenblätter vorhanden, wählen Sie das gewünschte aus
- Legen Sie den Tabellennamen fest (Standard: table_name)
- Wählen Sie, ob die erste Zeile als Feldnamen dienen soll
- SQL-INSERT-Anweisungen werden automatisch erzeugt und sind mit einem Klick kopierbereit
SQL-Erstellung prüfen
- Prüfen Sie Spaltennamen, Datentypen, Anführungszeichen und NULL-Behandlung, bevor Sie das erzeugte SQL auf einer echten Datenbank ausführen.
- Testen Sie vor Produktiv-Importen zunächst in einer temporären Tabelle und sichern Sie die ursprüngliche Tabellenkalkulation.
Anwendungsfälle
Technisches Prinzip
Die Seite parst die hochgeladene Arbeitsmappe mit SheetJS – XLSX.read(arrayBuffer, {type: 'array'}) gibt ein Arbeitsmappenobjekt zurück, dessen Arbeitsblatt Zellen nach A1-Schlüsseln indexiert hat, dann wandelt XLSX.utils.sheet_to_json(sheet, {header: 1, defval: null}) den begrenzten !ref-Bereich in ein Array von Arrays um. Die erste nicht leere Zeile (wenn „Erste Zeile als Spaltenüberschriften“ aktiviert ist) wird als Spaltennamen verwendet; andernfalls werden SheetJS-artige col1, col2, col3 erzeugt. Jede verbleibende Zeile wird als einzelne SQL-Anweisung der Form INSERT INTO `table` (`c1`, `c2`, ...) VALUES (v1, v2, ...); ausgegeben, optional mit vorangestelltem CREATE TABLE `table` (`c1` VARCHAR(255), ...);. Bezeichner-Zitierung variiert je nach SQL-Dialekt und wird durch den SQL:1992-Standard und die jeweilige Abweichung des Herstellers bestimmt: Standard-SQL und PostgreSQL zitieren Bezeichner mit doppelten Anführungszeichen ("col"), MySQL und MariaDB verwenden standardmäßig Akutzeichen (`col`) und akzeptieren doppelte Anführungszeichen nur bei aktiviertem ANSI_QUOTES-SQL-Modus, SQLite akzeptiert sowohl Akutzeichen als auch doppelte Anführungszeichen (und behandelt aus Kompatibilitätsgründen doppelt zitierte Bezeichner, die nicht aufgelöst werden können, als Zeichenkettenliteral – eine bekannte Stolperfalle, die in der SQLite-Quirks-Seite dokumentiert ist), SQL Server und Sybase verwenden eckige Klammern ([col]). Wert-Zitierung folgt den SQL-Zeichenkettenliteral-Regeln: einfache Anführungszeichen umschließen das Literal und werden durch Verdopplung maskiert ('O''Brien'), gemäß ISO/IEC 9075. Leere Zellen werden zum unzitierten Literal NULL, nicht zur leeren Zeichenkette ''; numerische Zellen mit cell.t === 'n` werden unzitiert ausgegeben; Booleans werden zu 1/0 oder TRUE/FALSE je nach Dialekt; Daten erfordern besondere Behandlung. Datumszellen benötigen besondere Aufmerksamkeit, da SheetJS die zugrunde liegende numerische Seriennummer bewahrt: Excel speichert Daten als Tage seit 1900-01-01 mit dem historischen Schaltjahresbug von 1900-02-29, der Daten vor März 1900 um einen Tag verschiebt, und das Excel-für-Mac-1904-System verwendet 1904-01-01 als Epochenstart. Die Konvertierung zu ISO 8601 (YYYY-MM-DD HH:mm:ss, das Format, das sowohl MySQL DATETIME als auch PostgreSQL TIMESTAMP akzeptieren) ist (serial - 25569) * 86400000 ms nach der Unix-Epoche, dann in UTC formatiert. Typerkennung ist rein lexikalisch und oberflächlich: eine Spalte, deren erste nicht leere Zelle eine Ganzzahl ist, wird INT, Dezimalzahlen werden DECIMAL(10,2), Text wird VARCHAR(255), und eine Spalte, die mit 2024-01-01 beginnt, kann als Zeichenkette exportiert werden, es sei denn, die Quellzelle trägt cell.t === 'd'. Bulk-Inserts werden als ein INSERT pro Zeile ausgegeben, was in großem Maßstab langsam ist; das Zusammenfassen von 100-500 Zeilen in ein einzelnes INSERT INTO t VALUES (...), (...), ...; reduziert die Netzwerk-Rundläufe um ca. 100x, und das Einwickeln des Skripts in BEGIN; ... COMMIT; macht den Import zu einer atomaren Transaktion, die beim ersten fehlschlagenden Zeile zurückgerollt wird.
- Bezeichner-Zitierung je nach Dialekt: MySQL/MariaDB `col` (Akutzeichen, oder "col" mit ANSI_QUOTES aktiv); PostgreSQL und Standard-SQL "col"; SQL Server [col]; SQLite akzeptiert beide (aber "col" fällt stillschweigend auf ein Zeichenkettenliteral zurück, wenn col kein bekannter Bezeichner ist).
- Zeichenkettenliteral-Maskierung (ISO/IEC 9075): mit einfachen Anführungszeichen umschließen und interne einfache Anführungszeichen verdoppeln (O'Brien → 'O''Brien'); niemals rohe Backslashes inline verwenden – PostgreSQL standard_conforming_strings ist seit 9.1 standardmäßig aktiv.
- Excel-Datumsseriennummer: Tage seit 1900-01-01 mit dem 1900-02-29-Bug (oder 1904-01-01 wenn workbook.date1904 wahr ist); ISO 8601-Zeichenkette = new Date((serial - 25569) * 86400000).toISOString().
- Typerkennung ist lexikalisch: Ganzzahlen → INT, Dezimalzahlen → DECIMAL(10,2), Text → VARCHAR(255); Daten, die wie Daten aussehen, aber nicht als cell.t === 'd' typisiert sind, werden als Zeichenketten exportiert; Währungszellen mit Tausendertrennzeichen werden mit dem Trennzeichen innerhalb der Zeichenkette exportiert.
- NULL-Behandlung: eine leere Excel-Zelle wird zum unzitierten Literal NULL, nicht zu '' – der Unterschied ist wichtig für NOT NULL-Spalten und für COUNT(col), das NULLs überspringt, aber '' zählt.
- Bulk-Insert: 100-500 Zeilen in ein einzelnes INSERT INTO t VALUES (...),(...),...; zusammenzufassen reduziert Netzwerk-Rundläufe um ca. 100x gegenüber einem INSERT pro Zeile; MySQLs max_allowed_packet (Standard 64 MB) begrenzt die Größe pro Anweisung.
- Das erzeugte Skript in BEGIN;...COMMIT; (PostgreSQL/SQLite) oder START TRANSACTION;...COMMIT; (MySQL InnoDB) einwickeln, damit eine einzelne fehlschlagende Zeile den gesamten Batch zurückrollt; MyISAM-Tabellen ignorieren die Transaktion und committen teilweise.
Beispiele
Excel-Tabelle → INSERT-Anweisungen
Tabelle "users" (3 Zeilen):
id | name | email | age
1 | Alice | alice@mail.com | 28
2 | Bob | bob@mail.com | 34
Generierter 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);Einzelnes mehrzeiliges INSERT (schnellerer Import)
Verwende die Option "Zeilen kombinieren" für Massenladungen:
INSERT INTO products (sku, name, price) VALUES
('A001', 'USB-C Cable', 9.90),
('A002', 'HDMI Adapter', 14.50),
('A003', 'Mouse Pad', 4.25);
Reduziert 3 Roundtrips auf 1 — sicherer für Stapel von 100-500 Zeilen.Anführungszeichen-Escaping bei Namen mit Apostroph
Quellzelle: O'Brien
Generierter SQL (einfache Anführungszeichen verdoppelt):
INSERT INTO customers (id, name) VALUES (42, 'O''Brien');
NULL-Behandlung — leere Excel-Zelle wird zu literalem NULL, nicht zu '':
INSERT INTO customers (id, phone) VALUES (43, NULL);Import in eine Transaktion einpacken
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;
Wenn eine Zeile fehlschlägt, wird der gesamte Stapel zurückgerollt.FAQ
Wird die Tabelle hochgeladen?
Nein. Die Datei wird in deinem Browser über SheetJS geparst und das SQL lokal generiert. Es wird nichts an einen Server gesendet, also bleiben auch sensible Datensätze auf deinem Gerät.
Welche SQL-Ausgabe wird erzeugt?
Eine CREATE TABLE-Anweisung gefolgt von einzelnen INSERT INTO-Zeilen (eine Zeile pro Anweisung). Das generierte SQL verwendet den von dir eingegebenen Tabellennamen und den von dir gewählten Anführungszeichen-Stil (einfach, doppelt oder Backtick).
Wie werden Spaltentypen abgeleitet?
Die Seite tastet jede Spalte ab und wählt den engsten passenden Typ: INTEGER, DECIMAL, VARCHAR(N), BOOLEAN oder DATE/DATETIME. Du kannst das vor dem Generieren des SQL überschreiben. Spalten mit gemischten Typen fallen auf VARCHAR zurück.
Was ist mit Excel-Datumsangaben?
Excel speichert Datumsangaben als Seriennummern. Die Seite gibt sie als Rohwert aus dem Tabellenblatt aus. Prüfe das generierte SQL und passe Datumsliterale bei Bedarf an das Format deiner Zieldatenbank an.
Wie werden Sonderzeichen und Anführungszeichen escaped?
Einfache Anführungszeichen werden verdoppelt (Smith's → Smith''s). Backslashes und Unicode werden wörtlich durchgereicht — das entspricht den standardkonformen Strings von PostgreSQL. Wenn du auf MySQL mit deaktiviertem NO_BACKSLASH_ESCAPES zielst, musst du Backslashes ggf. manuell escapen.
Funktioniert das Ergebnis auf MySQL, PostgreSQL, SQLite und MSSQL?
Die einfachen INSERTs funktionieren auf allen vier. Die CREATE TABLE-Anweisung verwendet portable Typen (INT, VARCHAR, DECIMAL, DATE). Für dialekt-spezifische Typen (SERIAL, AUTO_INCREMENT, IDENTITY) musst du die CREATE-Anweisung an dein Ziel anpassen.
Werden Formeln ausgewertet?
Nein. Es wird der von Excel gespeicherte zwischengespeicherte Wert verwendet. Öffne die Quelldatei, lasse neu berechnen, speichere und lade sie erneut hoch, wenn du frische Formelwerte brauchst.