Zum Inhalt springen

Excel-Import

DuckDB unterstützt das Lesen von Excel-.xlsx-Dateien. .xls-Dateien werden jedoch nicht unterstützt.

Excel-Tabellenblätter importieren

Verwenden Sie die Funktion read_xlsx in der FROM-Klausel einer Abfrage:

SELECT * FROM read_xlsx('test_excel.xlsx');

Alternativ können Sie die Funktion read_xlsx weglassen und DuckDB sie anhand der Dateiendung ableiten lassen:

SELECT * FROM 'test_excel.xlsx';

Wenn Sie jedoch Optionen übergeben möchten, um das Importverhalten zu steuern, sollten Sie die Funktion read_xlsx verwenden.

Eine solche Option ist der Parameter sheet, mit dem Sie den Namen des Excel-Arbeitsblatts angeben können:

SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

Standardmäßig wird das erste Blatt geladen, wenn kein Blatt angegeben ist.

Einen bestimmten Bereich importieren

Um einen bestimmten Zellbereich auszuwählen, verwenden Sie den Parameter range mit einer Zeichenkette im Format A1:B2, wobei A1 die Zelle oben links und B2 die Zelle unten rechts ist:

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'A1:B2');

Um beispielsweise die ersten 5 Zeilen zu überspringen:

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'A5:Z');

Um die ersten 5 Spalten zu überspringen:

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'E:Z');

Wenn kein range-Parameter angegeben ist, ermittelt DuckDB den Bereich automatisch als rechteckige Region von Zellen zwischen der ersten Zeile aufeinanderfolgender nicht-leerer Zellen und der ersten leeren Zeile über dieselben Spalten.

Standardmäßig beendet DuckDB das Lesen der Excel-Datei beim Auftreten einer leeren Zeile, wenn kein Bereich angegeben ist. Ist ein Bereich angegeben, wird standardmäßig bis zum Ende des Bereichs gelesen. Dieses Verhalten lässt sich mit dem Parameter stop_at_empty steuern:

-- Read the first 100 rows, or until the first empty row, whichever comes first
SELECT * FROM read_xlsx('test_excel.xlsx', range = '1:100', stop_at_empty = true);
-- Always read the whole sheet, even if it contains empty rows
SELECT * FROM read_xlsx('test_excel.xlsx', stop_at_empty = false);

Eine neue Tabelle anlegen

Um aus dem Ergebnis einer Abfrage eine neue Tabelle anzulegen, verwenden Sie CREATE TABLE ... AS mit einer SELECT-Anweisung:

CREATE TABLE new_tbl AS
SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

In eine vorhandene Tabelle laden

Um Daten aus einer Abfrage in eine vorhandene Tabelle zu laden, verwenden Sie INSERT INTO mit einer SELECT-Anweisung:

INSERT INTO tbl
SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

Alternativ können Sie die Anweisung COPY mit der Formatoption XLSX verwenden, um eine Excel-Datei in eine vorhandene Tabelle zu importieren:

COPY tbl FROM 'test_excel.xlsx' (FORMAT xlsx, SHEET 'Sheet1');

Wenn Sie die Anweisung COPY verwenden, um eine Excel-Datei in eine vorhandene Tabelle zu laden, werden die Typen der Spalten in der Zieltabelle verwendet, um die Typen der Zellen im Excel-Blatt umzuwandeln.

Ein Blatt mit/ohne Kopfzeile importieren

Um die erste Zeile als Namen der resultierenden Spalten zu behandeln, verwenden Sie den Parameter header:

SELECT * FROM read_xlsx('test_excel.xlsx', header = true);

Standardmäßig wird die erste Zeile als Kopfzeile behandelt, wenn alle Zellen in der ersten Zeile (innerhalb des ermittelten oder angegebenen Bereichs) nicht-leere Zeichenketten sind. Um dieses Verhalten zu deaktivieren, setzen Sie header auf false.

Typen erkennen

Wenn nicht in eine vorhandene Tabelle importiert wird, versucht DuckDB, die Typen der Spalten im Excel-Blatt anhand ihres Inhalts und/oder des „Zahlenformats“ zu erschließen.

  • Die Typen TIMESTAMP, TIME, DATE und BOOLEAN werden nach Möglichkeit anhand des auf die Zelle angewendeten „Zahlenformats“ erschlossen.
  • Textzellen mit TRUE und FALSE werden als BOOLEAN erkannt.
  • Leere Zellen gelten standardmäßig als Typ DOUBLE.
  • Andernfalls werden Zellen anhand ihres Inhalts als VARCHAR oder DOUBLE erkannt.

Sie können dieses Verhalten auf mehrere Arten anpassen.

Um alle leeren Zellen als VARCHAR statt als DOUBLE zu behandeln, setzen Sie empty_as_varchar auf true:

SELECT * FROM read_xlsx('test_excel.xlsx', empty_as_varchar = true);

Um die Typinferenz vollständig zu deaktivieren und alle Zellen als VARCHAR zu behandeln, setzen Sie all_varchar auf true:

SELECT * FROM read_xlsx('test_excel.xlsx', all_varchar = true);

Wenn der Parameter ignore_errors auf true gesetzt ist, ersetzt DuckDB Zellen, die nicht in den entsprechenden erschlossenen Spaltentyp umgewandelt werden können, stillschweigend durch NULL-Werte.

SELECT * FROM read_xlsx('test_excel.xlsx', ignore_errors = true);

Siehe auch

DuckDB kann Excel-Dateien auch exportieren. Weitere Details zur Excel-Unterstützung finden Sie auf der Seite der excel-Erweiterung.