Daten in Odoo importieren: CSV, Excel und externe IDs
Kurz gesagt
Daten importieren Sie in Odoo aus der Listenansicht des Objekts: Aktionen (Actions) ‣ Importieren (Import), Datei hochladen, Spalten prüfen, Test, Import. Enthält die Datei die Spalte Externe ID oder die Spalte Datenbank-ID, ändert ein zweiter Lauf die bereits importierten Datensätze, statt neue anzulegen; enthält sie keine der beiden Spalten, legt jeder Lauf neue Datensätze an. Ein Import lässt sich nicht zurücksetzen (Odoo 20.0, Dokumentation).
Das Wichtigste
- Import über Aktionen (Actions) ‣ Importieren (Import) in der Liste; Formate sind Excel (.xlsx) und CSV (.csv).
- Enthält die Datei die Spalte Externe ID (External ID) oder die Spalte Datenbank-ID (Database ID), ändert ein zweiter Import die bereits importierten Datensätze, statt sie neu anzulegen; enthält sie keine der beiden Spalten, entsteht bei jedem Lauf ein neuer Datensatz (Dokumentation 20.0).
- Je Feld ist nur eine Referenzart erlaubt: Name, Datenbank-ID (Database ID) oder Externe ID.
- Verknüpfte Datensätze zuerst importieren, etwa Produktkategorien vor Artikeln und Firmen vor Personen.
- Der Import ist dauerhaft; die Filter Erstellt am und Zuletzt aktualisiert am zeigen die betroffenen Datensätze.
Ein Import in Odoo hat zwei Teile: jede Spalte der Datei wird einem Feld zugeordnet, und Odoo entscheidet je Zeile, ob ein Datensatz neu entsteht oder ein vorhandener geändert wird. Diese Anleitung führt beide Teile an einem Fall durch, zwei Produktkategorien und zwei Artikel, und schließt mit einem zweiten Lauf, der nur die Preise anpasst. Wie Sie die Datei vorher bereinigen, steht in Stammdaten für Odoo vorbereiten.
Was Sie vorab brauchen
- Eine Odoo-20.0-Datenbank und Zugriff auf die App, in der das Zielobjekt liegt. Der Einstieg liegt in der Ansicht des Objekts, etwa unter Kontakte, Verkauf oder Lager.
- Eine Datei je Objekt. Die Dokumentation nennt Excel (.xlsx) und CSV (.csv); der Dateidialog nimmt zusätzlich .xls, .xlsm und .ods an (Dateiauswahl des Community-Zweigs 20.0).
- Eine Tabellenkalkulation, die CSV mit wählbarem Trennzeichen speichert; die Dokumentation nennt dafür OpenOffice und LibreOffice.
- In jeder Datei eine Spalte Externe ID (External ID) oder Datenbank-ID (Database ID). Eine der beiden Spalten entscheidet, ob der nächste Lauf die Datensätze ändert oder neu anlegt; fehlen beide, entsteht jedes Mal ein neuer Datensatz.
- Die Reihenfolge der Dateien: Ein Verweis zeigt auf einen Zielsatz, den es in Odoo schon geben muss.
Der Beispiellauf: Kategorien und Artikel
Das Beispiel legt zwei Kategorien und zwei Artikel an. Die Werte sind erfunden. Die Spaltennamen folgen der Dokumentation, die für einen Verweis auf einen anderen Datensatz die Form Feld/Externe ID vorgibt.
Erste Datei, kategorien.csv:
| Externe ID | Name |
|---|---|
| kat_10 | Ersatzteile |
| kat_20 | Zubehör |
Zweite Datei, artikel.csv:
| Externe ID | Name | Produktkategorie/Externe ID | Verkaufspreis |
|---|---|---|---|
| art_1001 | Dichtungssatz 40 mm | kat_10 | 12,90 |
| art_1002 | Montagebügel | kat_20 | 7,50 |
Die externe ID gilt über alle Objekte hinweg und darf nur einmal vorkommen. Ein zweiter Lauf mit unveränderten IDs ändert dieselben Datensätze. Was die externe ID von der Datenbank-ID unterscheidet, erklärt der Artikel Externe ID (Odoo).
Schritt für Schritt: importieren und erneut importieren
Schritt 1: Importseite öffnen
Öffnen Sie im Zielobjekt die Listenansicht, klicken Sie auf das Aktionen-Symbol (Zahnrad) und wählen Sie Importieren (Import). Nach dem Community-Zweig 20.0 zeigt Odoo den Eintrag in Listen-, Kanban- und Tabellenansichten einer Fensteraktion, wenn die Ansicht das Anlegen erlaubt (Attribut create) und den Import nicht abschaltet (Attribut import), und nicht auf kleinen Bildschirmen; eine reine Leseansicht zeigt ihn nicht. Der Import läuft auf einer eigenen Seite, nicht in einem Fenster über der Liste. Beschriftungen, Dialogaufbau und Sichtbarkeitsregel, die die Dokumentation nicht beschreibt, stammen aus dem öffentlichen Community-Zweig 20.0; für Enterprise, Odoo Online und Odoo.sh belegt der Community-Quellcode sie nicht, prüfen Sie die Namen dort in Ihrer eigenen Datenbank.
Schritt 2: Datei hochladen und Kopfzeile prüfen
Wählen Sie Hochladen (Upload) und dann kategorien.csv, oder ziehen Sie die Datei in das Fenster. Im linken Bereich steht die Option 1. Zeile als Kopfzeile verwenden (Use first row as header) und ist voreingestellt, sodass die erste Zeile die Spaltennamen liefert. Bei CSV-Dateien folgt darunter die Formatierung (Formatting) mit unter anderem Trennzeichen, Tausender- und Dezimaltrennzeichen, Datumsformat und Codierung; bei Excel-Dateien entfällt dieser Block. Unten im linken Bereich steht der Block Hilfe (Help). Er zeigt die Importvorlagen, die das Zielobjekt mitbringt, jeweils als Downloadlink, und darunter den Link zur Dokumentationsseite. Welche Vorlage dort erscheint, hängt vom Objekt ab: Der Import fragt das Zielmodell nach seinen Vorlagen, und die Basisimplementierung liefert keine; ein Objekt ohne eigene Vorlage zeigt nur den Dokumentationslink (Community-Zweig 20.0). Namentlich belegt sind im Community-Zweig 20.0 Vorlage für Kontakte (Template for Contacts) für Kontakte und Vorlage für Produkte (Template for Products) für Produkte; die im Beispiel zuerst importierten Produktkategorien bringen keine eigene Vorlage mit. Die Dokumentation nennt Vorlagen für die gängigsten Daten, etwa Kontakte, Produkte und Kontoauszüge; eine solche Vorlage lässt sich in einem Zug importieren, weil die Spaltenzuordnung darin bereits vorbereitet ist.
Schritt 3: Spalten zuordnen
Rechts zeigt Odoo eine Tabelle mit den Kopfspalten Dateispalte (File Column) und Odoo-Feld (Odoo Field); die Kopfspalte Sprache (Language) erscheint nach dem Community-Zweig 20.0 nur, wenn in der Datenbank mehr als eine Sprache installiert ist, und die Sprachauswahl je Zeile nur bei einem übersetzbaren Feld. Gehen Sie die Zeilen durch: Externe ID muss auf das Feld Externe ID (External ID) zeigen, Name auf Name. Das Auswahlmenü eines Feldes gruppiert die Möglichkeiten; nach dem Community-Zweig 20.0 sind das Erforderliche Felder, Vorgeschlagene Felder, Weitere Felder (die Gruppe heißt Standardfelder, solange Odoo keine Vorschläge macht) und Beziehungsfelder. Über die Suche finden Sie ein Feld auch dann, wenn Odoo es wegen des Spalteninhalts nicht selbst vorschlägt.
Schritt 4: Testen und importieren
Klicken Sie auf Test. Ist alles in Ordnung, meldet Odoo Alles scheint gültig zu sein. (Everything seems valid.); sonst stehen die Fehler unter der Tabelle, jeweils mit Spalte, Zeile und Wert. Korrigieren Sie die Quelldatei, laden Sie sie mit Erneut hochladen (Re-Upload) neu und testen Sie wieder. Erst der Klick auf Importieren (Import) schreibt die Datensätze; danach öffnet Odoo die Liste Importierte Datensätze (Imported records). Ein Import lässt sich nicht zurücksetzen.
Schritt 5: Artikel mit Verweis auf die Kategorien importieren
Wiederholen Sie den Weg für artikel.csv, diesmal über die Produktliste. Die Spalte Produktkategorie/Externe ID verweist auf die externe ID der zuvor angelegten Kategorien; nach der Dokumentation muss der Ziel-Datensatz vorher in Odoo liegen. Je Feld ist nur eine Referenzart erlaubt, also Name, Datenbank-ID (Database ID) oder Externe ID, nicht mehrere gemischt. Findet Odoo zwei Ziele mit gleichem Namen, hält die Prüfung an oder ordnet den zuerst gefundenen Datensatz zu; die Spalte mit der Endung /ID oder die externe ID des Ziels löst den Fall eindeutig.
Schritt 6: Ausschnitt für die Änderung exportieren
Für den zweiten Lauf brauchen Sie nicht die ganze Datei. Markieren Sie in der Liste die betroffenen Datensätze, wählen Sie Aktionen (Actions) ‣ Exportieren (Export) und schalten Sie den Schalter Updatable fields only ein. Nach der Dokumentation 20.0 beschränkt er die Liste Verfügbare Felder (Available fields) auf die Felder, die sich wieder importieren lassen, und nimmt die Spalte Externe ID (External ID) in den Export auf; in der Liste Zu exportierende Felder (Fields to export) erscheint diese Spalte dabei nicht. Eine deutsche Beschriftung hat der Schalter im Zweig 20.0 nicht. Rechts ordnen Sie die übrigen Spalten und laden die Datei als Excel- oder CSV-Datei herunter. Eine solche Zusammenstellung lässt sich als Exportvorlage speichern und beim nächsten Export aus dem Auswahlfeld laden.
Schritt 7: Geänderte Datei erneut importieren
Ändern Sie in der Tabelle nur die Preisspalte, im Beispiel art_1001 auf 13,90, und lassen Sie die Spalte Externe ID unverändert. Laden Sie die Datei über Aktionen ‣ Importieren (Import) erneut hoch und prüfen Sie im Test, dass jede Spalte wieder auf demselben Feld liegt. Enthält die Datei die Spalte Externe ID oder Datenbank-ID, ändert Odoo die vorhandenen Datensätze; die Meldung nennt anschließend die Zahl der verarbeiteten Datensätze. Entfernen oder ändern Sie eine ID, kann Odoo einen weiteren Datensatz anlegen, statt den vorhandenen zu ändern.
So prüfen Sie das Ergebnis
Filtern Sie die Liste nach Erstellt am (Created on) und Zuletzt aktualisiert am (Last Updated on) und vergleichen Sie die Trefferzahl mit der Zeilenzahl der Datei ohne Kopfzeile. Öffnen Sie einen Artikel und kontrollieren Sie die verknüpfte Produktkategorie. Im Entwicklermodus zeigt Einstellungen (Settings) ‣ Technisch (Technical) ‣ Benutzerschnittstelle (User Interface) ‣ Sequenzen und Identifizierungen (Sequences & Identifiers) ‣ Externe IDs (External Identifiers) die vergebenen Kennungen mit ihrer vollständigen ID; dort finden Sie einen Datensatz über seine externe ID wieder und sehen, ob zwei Einträge dieselbe Kennung tragen.
Wenn etwas nicht klappt
| Symptom | Ursache | Behebung |
|---|---|---|
| Importieren fehlt im Aktionen-Menü | Die Ansicht ist keine Listen-, Kanban- oder Tabellenansicht einer Fensteraktion, erlaubt kein Anlegen (Attribut create), schaltet den Import ab (Attribut import), oder der Bildschirm ist zu klein (Sichtbarkeitsregel des Community-Zweigs 20.0) | Die Listenansicht des Objekts auf einem größeren Bildschirm öffnen und das Anlegen in der Ansicht zulassen; in Enterprise, Odoo Online und Odoo.sh die Beschriftungen in Ihrer eigenen Datenbank prüfen |
| Zweiter Lauf legt alles doppelt an | Weder die Spalte Externe ID noch die Spalte Datenbank-ID ist enthalten, eine der Spalten wurde umbenannt, oder ein ID-Wert wurde geändert | Eine ID-Spalte unverändert lassen; für den Abgleich mit dem Schalter Updatable fields only exportieren, die heruntergeladene Datei enthält die Spalte Externe ID dann auch ohne Auswahl in der Liste Zu exportierende Felder |
| Tag und Monat vertauscht | Odoo schätzt das Datumsformat aus den ersten zehn Zeilen | In CSV JJJJ-MM-TT schreiben, in Excel Datumszellen verwenden |
| Import bricht mit Zeitüberschreitung ab | Datei zu groß für einen Durchgang (Dokumentation 20.0) | Datei in kleinere Stapel teilen; im Entwicklermodus die Stapelgröße senken (Feld Stapelgröße, Community-Zweig 20.0) |
| Artikel landen in der falschen Kategorie | Zwei Kategorien mit gleichem Namen | Zielspalte mit der Endung /ID oder die externe ID des Ziels verwenden |
| Eine Spalte lässt sich keinem Feld zuordnen | Beschriftung passt zu keinem Feldnamen | Feld über die Suche wählen und die Spalte künftig wie das Feld benennen |
| Import bricht bei einer Zahl ab | Unbekanntes Währungssymbol in der Zelle | Symbol entfernen; negative Werte in Klammern setzen, Symbol innerhalb der Klammern |
| Werte bleiben unzugeordnet | Kein passender Datensatz vorhanden, oder der Zellwert passt zu keinem erlaubten Wert des Felds | Unter der Meldung zeigt Odoo je Spalte ein Auswahlfeld „Wenn ein Wert nicht zugeordnet werden kann:“ (When a value cannot be matched:) — im Community-Zweig 20.0 nur bei Beziehungs-, Auswahl- und Ja/Nein-Feldern und nur, wenn dort mehr als eine Möglichkeit besteht. Zur Wahl stehen: Import verhindern (Prevent import) immer; Datensatz überspringen (Skip record) nur bei einem Feld, das nicht erforderlich ist; Wert als leer einstellen (Set value as empty) bei einem nicht erforderlichen Beziehungs- oder Auswahlfeld; Neue Werte erstellen (Create new values) bei einem Beziehungsfeld; bei einem Auswahlfeld stattdessen je Auswahlwert Einstellung: Beschriftung (Set to: …); bei einem Ja/Nein-Feld Einstellung: Falsch (Set to: False) und Einstellung: Wahr (Set to: True). Bei Text-, Datums- und Zahlenfeldern entfällt das Auswahlfeld, dort bleibt die Fehlermeldung; in Enterprise, Odoo Online und Odoo.sh die Optionen in Ihrer eigenen Datenbank prüfen |
Wann Sie Hilfe holen sollten
Kommen die Daten aus mehreren verknüpften Tabellen eines Altsystems, muss die externe ID außerhalb von Odoo gebildet werden; das ist eine Aufgabe für die Datenbank- oder Partnerseite. Bei großen Dateien verarbeitet Odoo den Import in Stapeln: Der öffentliche Community-Zweig 20.0 aktiviert ab mehr als 100 Zeilen die Stapelverarbeitung mit Fortschrittsanzeige und Schaltfläche Import stoppen (Stop Import), die den Lauf nach dem laufenden Stapel beendet; die voreingestellte Stapelgröße ist dort 2000 Zeilen und lässt sich im Entwicklermodus im Feld Stapelgröße (Batch size) ändern. Für Enterprise, Odoo Online und Odoo.sh belegt der Community-Quellcode diese Werte nicht. Die Dokumentation 20.0 nennt für Zeitüberschreitungen nur, dass Sie große Exporte und Importe in kleineren Stapeln verarbeiten sollen. Probieren Sie den Ablauf in einer Kopie der Datenbank, nicht in der Produktivumgebung; bei Odoo.sh eignet sich dafür eine Staging-Datenbank (siehe Odoo.sh: Leistungsumfang, Branches und Grenzen). Klären Sie mit Ihrer Odoo-Administration, wer in Ihrer Datenbank importieren darf. Eröffnungssalden und offene Posten folgen einer eigenen Abfolge: Eröffnungssalden und offene Posten in Odoo übernehmen.