Chuyển dữ liệu từ Excel/CSV sang Odoo: Thứ tự, ID và lỗi
Chuyển dữ liệu từ Excel/CSV sang Odoo không trùng lặp: External ID, thứ tự import, cột liên kết, lỗi ngày tháng và cách xử lý.
Long Nguyen
Lập trình viên Fullstack · Kỹ sư AI · Nhà nghiên cứu
Cách chuyển dữ liệu từ Excel hoặc CSV sang Odoo: Tóm tắt
Công cụ import của Odoo chấp nhận tệp .xlsx và .csv cho mọi đối tượng nghiệp vụ, bao gồm liên hệ, sản phẩm, bút toán nhật ký và đơn hàng. Tải tệp lên là phần đơn giản. Một lần chuyển dữ liệu thành công hay thất bại phụ thuộc vào ba quyết định bạn đưa ra ngay trong bảng tính, trước khi mở Odoo:
- Mỗi model Odoo một sheet. Khách hàng, sản phẩm và dòng đơn hàng là các lần import riêng, sử dụng các tệp riêng.
- Mỗi dòng có một External ID ổn định. Đây là yếu tố giúp bạn import lại tệp đã sửa mà không tạo bản ghi trùng lặp.
Một sản phẩm chỉ có thể trỏ đến danh mục đã tồn tại trong Odoo.
Import là thao tác không thể hoàn tác. Tài liệu Odoo nêu rõ rằng các lần import không thể được undo, vì vậy toàn bộ quy trình dưới đây tập trung vào việc làm đúng tệp trong lần chạy Test, thay vì sửa sau khi dữ liệu đã được đưa vào hệ thống.
Lưu ý phiên bản: Odoo 20 được phát hành vào tháng 9 năm 2026 theo trang ghi chú phát hành của Odoo. Hướng dẫn này được đối chiếu với tài liệu phiên bản 19.0. Cơ chế External ID và import lại được tài liệu hóa tương tự từ phiên bản 14.0, nhưng bạn vẫn nên kiểm tra tên menu trên phiên bản đang dùng bằng một lần chạy Test trước khi tin cậy hoàn toàn.
Bảng tính nào sẽ trở thành bản ghi nào trong Odoo?
Hãy ánh xạ mỗi tab trong workbook với một model Odoo, sau đó import theo thứ tự phụ thuộc. Theo tài liệu Odoo, đối tượng được một liên kết trỏ đến phải tồn tại trước các bản ghi sử dụng liên kết đó. Bảng dưới đây áp dụng nguyên tắc này cho một doanh nghiệp thường quản lý dữ liệu bằng Excel.
| Thứ tự import | Bảng tính của bạn | Trở thành trong Odoo | Lý do đặt ở vị trí này |
|---|---|---|---|
| 1 | Công ty khách hàng và nhà cung cấp | Liên hệ (công ty) | Các bản ghi khác sẽ tham chiếu đến họ, bao gồm người liên hệ và đơn hàng. |
| 2 | Người liên hệ | Liên hệ (cá nhân) | Mỗi dòng tham chiếu đến công ty bằng External ID. |
| 3 | Danh mục sản phẩm, thẻ | Danh mục sản phẩm | Sản phẩm sẽ tham chiếu đến danh mục. |
| 4 | Danh mục sản phẩm | Sản phẩm | Các dòng đơn hàng sẽ tham chiếu đến sản phẩm. |
| 5 | Báo giá và đơn hàng đang mở | Đơn bán hàng hoặc đơn mua hàng kèm dòng chi tiết | Đơn hàng tham chiếu đến khách hàng và sản phẩm nên được import sau cùng. |
Một nguyên tắc thực tế hợp lý là chuyển trạng thái hiện tại thay vì toàn bộ lịch sử: khách hàng đang hoạt động, danh mục sản phẩm hiện dùng và đơn hàng đang mở. Việc làm sạch nhiều năm dữ liệu đơn hàng đã đóng thường không tương xứng với công sức bỏ ra; một bản export chỉ đọc của workbook cũ có thể đáp ứng những lần tra cứu không thường xuyên. Đây là quyết định tùy tình huống, không phải yêu cầu của Odoo, nên hãy điều chỉnh nếu kiểm toán viên hoặc kế toán của bạn cần lịch sử ngay trong hệ thống.
Cách chuẩn bị dữ liệu Excel để import vào Odoo
Hãy bắt đầu từ một tệp mà Odoo đã hiểu sẵn. Màn hình import cung cấp template cho các đối tượng phổ biến, với cấu hình ánh xạ cột được thiết lập trước. Nếu đối tượng của bạn không có template, tài liệu Odoo đề xuất export một bản ghi mẫu có các trường bạn muốn import để tên cột khớp chính xác. Đừng xóa cột External ID khỏi template.
Sau đó, loại bỏ những thói quen giúp workbook dễ đọc với con người nhưng gây khó hiểu cho công cụ import:
| Thói quen khi dùng Excel | Cách nên làm |
|---|---|
| Ô gộp, tiêu đề gồm hai dòng | Chỉ dùng một dòng tiêu đề, mỗi dòng là một bản ghi và không gộp ô. |
| Dòng tổng, ghi chú và dòng trống để ngăn cách | Xóa chúng. Mỗi dòng đều được import thành một bản ghi. |
| Ngày được nhập dưới dạng văn bản, chẳng hạn 01-03-2016 | Dùng ô ngày thực trong .xlsx, hoặc ISO 8601 (2016-03-01) trong CSV. Odoo có thể đoán định dạng ngày nhưng không biết 01-03-2016 là ngày-tháng hay tháng-ngày. |
| Giá có kèm ký hiệu tiền tệ, chẳng hạn ABC 32.000,00 | Dùng số thuần túy. Odoo chấp nhận các ký hiệu như $ hoặc ký hiệu euro ở cuối, nhưng ký hiệu tiền tệ không xác định có thể làm import bị lỗi. |
| Tên danh mục có nhiều cách viết | Chuẩn hóa trước. Các cột liên kết được đối chiếu với bản ghi hiện có theo tên hoặc ID, vì vậy mọi biến thể phải trỏ được về một bản ghi duy nhất. |
| Cùng một khách hàng xuất hiện hai lần | Loại bản ghi trùng trong bảng tính. Những dòng không có External ID luôn tạo bản ghi mới. |
Chọn loại tệp: ưu tiên .xlsx khi dữ liệu được nhập trực tiếp trong Excel. Odoo không hiển thị các tùy chọn CSV Formatting cho tệp Excel, nên bạn không phải đoán dấu phân cách hay định dạng ngày; các ô ngày thực cũng không bị hiểu nhầm. Hãy dùng CSV khi tệp được tạo bởi script hoặc một hệ thống khác.
External ID giúp tránh trùng lặp khi import Odoo như thế nào?
External ID là mã định danh duy nhất do bạn gán cho mỗi dòng được import. Việc đặt mã này không bắt buộc, nhưng nó mở khóa hai khả năng cần thiết cho một dự án chuyển dữ liệu thực tế: import cùng một tệp nhiều lần mà không tạo bản ghi trùng, và liên kết các bản ghi với nhau. Khi tệp có cột External ID hoặc Database ID, các dòng đã tồn tại sẽ được cập nhật thay vì tạo mới.
Ba quy tắc quyết định cơ chế này có hoạt động hay không:
- Không trùng trên mọi đối tượng. ID không được lặp ở bất kỳ đâu, vì vậy một khách hàng và một sản phẩm không thể cùng mang mã
1. Hãy thêm tiền tố theo nguồn, chẳng hạncust_hoặcprod_. - Ổn định theo thời gian. Nếu ID bị đổi hoặc xóa giữa các lần import, Odoo sẽ thêm bản ghi trùng thay vì cập nhật bản ghi gốc.
- Hai bản ghi cùng ID sẽ xung đột. Hãy kiểm tra bản trùng trước khi tải tệp lên.
Một lời khuyên thực tế bổ sung cho tài liệu: hãy xây dựng ID từ một khóa nghiệp vụ sẵn có, chẳng hạn mã khách hàng cũ hoặc SKU, thay vì số thứ tự dòng. Chuỗi số kéo xuống phù hợp cho một lần nạp dữ liệu duy nhất. Nhưng nếu bạn sẽ sửa lỗi và import lại, việc sắp xếp hoặc chèn dòng trong Excel sẽ đánh số lại toàn bộ; lần import tiếp theo có thể âm thầm tạo bản sao của những bản ghi đã được nạp.
External ID,Name,Is a Company,Related Company/External ID
cust_0041,Hanoi Steel Fittings JSC,True,
cust_0042,Mai Tran,False,cust_0041
Dòng thứ hai liên kết người liên hệ với công ty thông qua External ID của công ty. Dòng công ty phải được import trước, đó là lý do thứ tự ở phần trước rất quan trọng.
Cách import các mối liên hệ: công ty, danh mục và dòng đơn hàng
Odoo cung cấp ba cách tham chiếu đến một bản ghi liên quan trong một cột. Mỗi trường chỉ nên dùng một cách.
| Kiểu cột | Ví dụ | Dùng khi nào |
|---|---|---|
| Theo tên hoặc mã | Country: Belgium |
Dữ liệu được nhập thủ công và tên là duy nhất. |
| Theo External ID | Country/External ID: base.be |
Dữ liệu đến từ hệ thống khác hoặc tên bị trùng. |
| Theo Database ID | Country/Database ID: 21 |
Ít khi dùng. Chủ yếu dành cho developer vì đây là số nội bộ của Odoo. |
Đối chiếu theo tên có một bẫy thường gặp. Nếu hai danh mục có cùng tên danh mục con, chẳng hạn Misc. Products/Sellable và Other Products/Sellable, Odoo sẽ dừng bước xác thực nhưng có thể vẫn cho phép import; khi đó mọi dòng sẽ được liên kết với kết quả khớp đầu tiên. Odoo không khuyến nghị import trong trạng thái này. Hãy đổi tên một danh mục hoặc chuyển cột sang External ID.
Trường nhiều-nhiều (thẻ)
Đặt các giá trị trong một ô, phân tách bằng dấu phẩy và không có khoảng trắng, chẳng hạn Manufacturer,Retailer. Trong tệp CSV, ô này phải được đặt trong dấu ngoặc kép vì bản thân giá trị có chứa dấu phẩy:
External ID,Name,Tags
cust_0041,Hanoi Steel Fittings JSC,"Manufacturer,Retailer"
Trường một-nhiều (dòng đơn hàng)
Dành một dòng cho mỗi dòng đơn hàng. Dòng đầu tiên nằm trên cùng dòng với phần thông tin đầu đơn hàng. Mỗi dòng bổ sung được đặt trên một dòng riêng, trong đó mọi cột cấp đơn hàng đều để trống.
External ID,Customer,Order Lines/Product,Order Lines/Quantity
so_0001,Hanoi Steel Fittings JSC,Hex bolt M8,100
,,Washer M8,200
so_0002,Mai Tran,Hex bolt M8,40
Hãy xem tên các cột này chỉ là ví dụ minh họa. Nhãn trường có thể khác nhau tùy ứng dụng và phiên bản, vì vậy hãy sao chép chính xác tiêu đề từ template của Odoo hoặc từ bản export của một đơn hàng hiện có.
Từng bước import tệp Excel hoặc CSV vào Odoo
- Sao lưu trước. Tạo bản sao lưu cơ sở dữ liệu hoặc thực hiện lần chạy đầu tiên trên một bản sao của cơ sở dữ liệu. Không có chức năng undo.
- Mở màn hình import. Trong chế độ xem danh sách của đối tượng đích, nhấp vào biểu tượng Action (bánh răng) và chọn Import records. Ở các phiên bản cũ, mục này nằm trong Favorites.
- Nạp tệp. Tải Import Template cho đối tượng đó hoặc nhấp vào Upload Data File.
- Kiểm tra Formatting (chỉ dành cho CSV). Xác nhận dấu phân cách, dấu bao văn bản, định dạng ngày và dấu phân cách hàng nghìn. Các tùy chọn này không xuất hiện với tệp Excel.
- Kiểm tra ánh xạ cột. Mỗi File Column phải được ánh xạ đến đúng Odoo Field. Tự ánh xạ những cột chưa được nhận diện.
- Nhấp Test, sửa lỗi rồi Test lại. Lặp lại cho đến khi kết quả kiểm tra không còn lỗi.
- Nhấp Import.
Hai chi tiết có thể giúp tiết kiệm thời gian. Thứ nhất, Odoo đoán kiểu trường của mỗi cột từ mười dòng đầu tiên, nên một cột chỉ có số sẽ chỉ được gợi ý các trường số nguyên. Nếu không thấy trường cần dùng, hãy bật tùy chọn hiển thị các trường của trường liên kết (nâng cao). Thứ hai, khi bật developer mode, menu Advanced có thêm Track history during import, tùy chọn này thiết lập việc theo dõi, thông báo và subscription nên làm import chậm hơn; đồng thời có thêm Allow matching with subfields.
Vì sao import Odoo thất bại? Các lỗi thường gặp và cách xử lý
| Hiện tượng | Nguyên nhân | Cách khắc phục |
|---|---|---|
| Toàn bộ dòng xuất hiện trong một cột | Dấu phân cách không phải dấu phẩy. Odoo không tự nhận diện tệp được phân tách bằng tab. | Điều chỉnh Formatting cho dấu phân cách khác hoặc lưu lại tệp dưới dạng phân tách bằng dấu phẩy. |
| Dấu phân cách liên tục thay đổi sau khi lưu từ Excel | Ứng dụng bảng tính dùng thiết lập vùng của máy tính cho dấu phân cách. Ở các locale dùng dấu phẩy thập phân, dấu này thường là dấu chấm phẩy. | Lưu lại bằng LibreOffice hoặc OpenOffice với Edit filter settings, hoặc thiết lập encoding trong hộp thoại Save As của Excel. |
| Ngày rơi vào sai tháng | Odoo đoán nhầm thứ tự ngày và tháng. | Đặt Date Format rõ ràng thành ISO 8601 hoặc dùng ô ngày thực trong .xlsx. |
| Import bị lỗi ở cột giá | Ký hiệu tiền tệ không xác định hoặc số âm được viết như $ (32.000,00). |
Số âm trong ngoặc cần đặt ký hiệu vào bên trong: (32000.00 €). An toàn nhất là dùng số thuần túy. |
| Cột không hiển thị trường cần dùng | Kiểu trường được đoán từ mười dòng đầu tiên. | Bật hiển thị các trường của trường liên kết (nâng cao) rồi chọn trường thủ công. |
| Tất cả sản phẩm rơi vào một danh mục sai | Tên danh mục con bị trùng và được đối chiếu với kết quả đầu tiên. | Đổi tên các danh mục trùng hoặc dùng cột Category/External ID. |
| Bị trùng sau lần import thứ hai | External ID đã bị đổi hoặc xóa giữa các lần chạy. | Giữ nguyên ID trong mọi tệp. Export lại với tùy chọn tương thích import để khôi phục chúng. |
| Các trường để trống trở thành giá trị rỗng thay vì giá trị mặc định | Cột có ô trống sẽ ghi giá trị rỗng. Cột không xuất hiện sẽ nhận giá trị mặc định. | Xóa những cột bạn không định điền dữ liệu. |
Có thể hoàn tác import Odoo không và tệp có thể lớn đến mức nào?
Bạn không thể hoàn tác một lần import. Hỗ trợ tích hợp duy nhất của Odoo là cho phép lọc bản ghi theo ngày tạo hoặc ngày chỉnh sửa gần nhất để xem import đã tác động đến những bản ghi nào. Trên thực tế, cách rollback thực sự là khôi phục bản sao lưu, đó là lý do lần chạy đầu tiên nên được thực hiện trên một bản sao cơ sở dữ liệu.
Tài liệu không đặt giới hạn số dòng. Tuy nhiên, tài liệu cảnh báo tệp lớn có thể gây timeout hoặc khiến một bản ghi không được xử lý, và khuyến nghị chia import thành các batch nhỏ hơn. Chia batch cũng hữu ích khi gỡ lỗi: một tệp 500 dòng có một dòng sai sẽ dễ sửa hơn tệp 20.000 dòng có cùng lỗi đó. Nếu import nhiều hình ảnh sản phẩm, developer mode sẽ hiển thị kích thước batch tối đa và khoảng trễ giữa các batch.
Cách cập nhật bản ghi Odoo hiện có từ bảng tính
Công cụ tương tự cũng có thể cập nhật hàng loạt bản ghi. Chọn các bản ghi trong chế độ xem danh sách, chọn Export rồi đánh dấu tùy chọn I want to update data (import-compatible export). Tùy chọn này giới hạn danh sách trường ở những trường có thể import và tự động bao gồm External ID. Chỉnh sửa tệp, sau đó import theo quy trình thông thường.
Chỉ giữ lại các cột bạn định thay đổi và tuyệt đối không chỉnh sửa cột External ID. Nếu ID bị thay đổi hoặc xóa, Odoo sẽ tạo bản ghi trùng thay vì cập nhật bản ghi hiện có.
Quy trình xuất-sửa-import này cũng phù hợp với giai đoạn chuyển đổi kéo dài: tiếp tục dùng bảng tính làm nguồn dữ liệu chuẩn cho đến khi go-live, rồi import lại các tệp đã sửa thường xuyên khi cần. Cách này chỉ hiệu quả nếu ID được giữ ổn định ngay từ lần import đầu tiên.
Khi nào import Excel/CSV là chưa đủ?
Công cụ import phù hợp với dữ liệu dạng bảng có thể sửa thủ công. Một migration bằng script thường là lựa chọn tốt hơn khi có một trong các tình huống sau:
- Dữ liệu nguồn cần các quy tắc chuyển đổi hoặc xác thực liên quan đến nhiều sheet, chẳng hạn tách một cột lộn xộn thành nhiều thuộc tính.
- Tên các bản ghi liên quan không rõ ràng và bạn không thể đổi tên các bản ghi nguồn.
- Hệ thống cũ vẫn tiếp tục hoạt động trong giai đoạn chạy song song, nên việc nạp dữ liệu phải có thể lặp lại và so sánh chênh lệch.
- Khối lượng dữ liệu đủ lớn khiến việc chia batch thủ công trở thành phần chính của dự án.
Nếu nguồn dữ liệu của bạn là danh mục cửa hàng hoặc workbook nhiều sheet có những vấn đề trên, dịch vụ chuyển dữ liệu CSV và Excel của Netalith hỗ trợ phương án chạy script, bao gồm duy trì ID ổn định cho các lần nạp lặp lại.
Checklist chuyển dữ liệu từ Excel sang Odoo
- Mỗi tab tương ứng một model Odoo, có một dòng tiêu đề và không có ô gộp hoặc dòng tổng.
- Mỗi dòng có External ID với tiền tố, được tạo từ một khóa nghiệp vụ.
- Cột liên kết chỉ dùng tên khi tên là duy nhất; các trường hợp còn lại dùng External ID.
- Ngày là ô ngày thực hoặc ISO 8601; số liệu là số thuần túy.
- Các tệp được sắp xếp theo thứ tự bản ghi cha trước: công ty, người liên hệ, danh mục, sản phẩm, đơn hàng.
- Lần chạy đầy đủ đầu tiên được thực hiện trên bản sao cơ sở dữ liệu và mọi tệp đều vượt qua Test mà không có lỗi.
- Tệp lớn được chia thành các batch và đã có bản sao lưu trước khi import vào hệ thống thật.
Nếu bạn muốn có một đơn vị thiết kế, viết script và kiểm tra toàn bộ quy trình chuyển dữ liệu, hãy xem dịch vụ phát triển và chuyển đổi Odoo của Netalith.
CÂU HỎI THƯỜNG GẶP
Câu hỏi thường gặp
Có thể import trực tiếp tệp Excel vào Odoo không?
Có. Công cụ import của Odoo chấp nhận cả tệp .xlsx và .csv cho mọi đối tượng nghiệp vụ. Mở chế độ xem danh sách, nhấp vào biểu tượng Action, chọn Import records, tải tệp lên, kiểm tra ánh xạ cột, nhấp Test rồi Import. Tệp CSV còn hiển thị các tùy chọn Formatting cho dấu phân cách và định dạng ngày; tệp Excel thì không.
Có bắt buộc phải có External ID khi import dữ liệu vào Odoo không?
Không bắt buộc. Tuy nhiên, nếu không có External ID, bạn không thể an toàn import lại tệp đã sửa vì mỗi dòng sẽ tạo một bản ghi mới; đồng thời bạn cũng không thể liên kết các bản ghi từ những tệp khác với bản ghi đó. Với mọi dự án chuyển dữ liệu thực tế, hãy gán cho mỗi dòng một External ID duy nhất và ổn định, có tiền tố như cust_ hoặc prod_.
Có thể hoàn tác một lần import Odoo không?
Không. Tài liệu Odoo nêu rõ import là thao tác không thể hoàn tác. Bạn có thể lọc theo ngày tạo hoặc ngày chỉnh sửa gần nhất để xem những bản ghi bị tác động, nhưng cách rollback thực tế là khôi phục bản sao lưu. Hãy thực hiện lần chạy đầy đủ đầu tiên trên một bản sao cơ sở dữ liệu.
Nên import dữ liệu vào Odoo theo thứ tự nào?
Hãy import đối tượng được liên kết trước các bản ghi tham chiếu đến đối tượng đó. Thứ tự thông thường là công ty, người liên hệ, danh mục sản phẩm, sản phẩm, sau đó là đơn hàng kèm dòng chi tiết. Mỗi tệp về sau sẽ tham chiếu đến các bản ghi trước đó bằng tên hoặc External ID.
Vì sao ngày tháng trong lần import Odoo bị sai?
Odoo đoán định dạng ngày dựa trên các mẫu phổ biến, trong khi giá trị như 01-03-2016 có thể được hiểu theo thứ tự ngày-tháng hoặc tháng-ngày. Với tệp CSV, hãy đặt Date Format rõ ràng theo ISO 8601 (YYYY-MM-DD). Với tệp Excel, hãy lưu ngày trong các ô ngày thực thay vì nhập dưới dạng văn bản.
Làm cách nào để import dòng đơn hàng hoặc nhiều thẻ trong cùng một tệp?
Với các trường nhiều-nhiều như thẻ, hãy đặt các giá trị trong một ô, phân tách bằng dấu phẩy và không có khoảng trắng; trong CSV, ô đó cần được đặt trong dấu ngoặc kép. Với các trường một-nhiều như dòng đơn hàng, đặt dòng đầu tiên trên cùng dòng với đơn hàng và mỗi dòng bổ sung trên một dòng riêng, để trống các cột cấp đơn hàng.
Tệp import Odoo có thể lớn đến mức nào?
Tài liệu Odoo không đặt giới hạn cố định. Tuy nhiên, tài liệu cảnh báo các tệp rất lớn có thể gây timeout hoặc khiến một bản ghi không được xử lý, đồng thời khuyến nghị chia lần import thành các batch nhỏ hơn.