Skip to main content
Import Purchase Order Lines from CSV/Excel File — A build-to-order Odoo module that lets your buyers upload a CSV or Excel fi — 1/1Illustrative preview

A build-to-order Odoo module that lets your buyers upload a CSV or Excel file and drop dozens or hundreds of

validated lines straight onto a purchase order.

ECOSIRE builds, installs, and supports it for Odoo 17, 18, and 19.

What is Import Purchase Order Lines from CSV/Excel File?

A build-to-order Odoo module that lets your buyers upload a CSV or Excel file and drop dozens or hundreds of validated lines straight onto a purchase order. ECOSIRE builds, installs, and supports it for Odoo 17, 18, and 19. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Import action button on the `purchase.order` form that opens a `TransientModel` upload wizard, appending lines to the order in place
Accepts `.csv`, `.xls`, and `.xlsx` uploads, parsed server-side via Python `csv` plus `openpyxl`/`xlrd` with encoding and delimiter detection
Interactive column-mapping step that binds spreadsheet headers to `purchase.order.line` fields, with reusable saved mapping profiles per supplier
Product matching by internal reference (`default_code`), barcode, or supplier product code on `product.supplierinfo`, with configurable match priority
Per-row validation pass that reports unknown products, non-numeric quantities, empty required cells, and duplicate rows before any write
Unit-of-measure resolution and conversion against the product's UoM, flagging incompatible units instead of corrupting quantities
Optional price handling: use the file's unit cost, or let Odoo compute price from the vendor pricelist and `product.supplierinfo`
Respects standard `onchange`/compute logic for taxes, `date_planned`, and line description unless the file provides explicit overrides
Analytic distribution and per-line notes carried through from the file where columns are mapped
Downloadable error report and a preview of parsed rows so buyers confirm the result before committing the import
Access controlled through `ir.model.access.csv` and existing record rules — no import path that bypasses purchase-order edit rights
Idempotency guard to prevent double-importing the same file onto the same order, plus an audit note in the chatter
Batch-safe writes for large files (hundreds of lines) using bulk `create` to avoid per-row ORM overhead
Downloadable template spreadsheet generated from your confirmed column map to standardize supplier submissions

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

Every procurement team eventually hits the same wall: a supplier sends a quotation, a reorder sheet, or a container packing list as a spreadsheet, and someone has to retype it line by line into a purchase order. On an RFQ with 80 or 200 lines that is an hour of manual entry per order, and every keystroke is a chance to fumble a quantity, a unit price, or a product reference. Odoo's core purchase.order form is excellent for building an order interactively, but it has no native "bulk paste from a spreadsheet" path on the order lines. The standard import tooling operates at the top level (creating whole records from a flat file) rather than appending many purchase.order.line records onto the order a buyer is already editing, so teams fall back to retyping or to fragile external scripts that hit the API and bypass the on-form logic.

This is a made-to-order module that ECOSIRE builds for your database. It adds an import action directly on the purchase order — typically a button in the header and a wizard (models.TransientModel) that accepts a .csv, .xls, or .xlsx upload, parsed server-side with Python's csv module and openpyxl/xlrd. The wizard presents a column-mapping step so your file's headers ("SKU", "Qty", "Unit Cost", "Supplier Ref", "Description") map onto Odoo fields, and product matching resolves each row against internal reference (default_code), barcode, or the supplier product code on product.supplierinfo. Rows are validated before anything is written: unknown products, non-numeric quantities, blank required cells, and unit-of-measure mismatches are collected into a per-row error report rather than silently dropped, so the buyer sees exactly what to fix.

Under the hood the module respects the same business logic a manual line would trigger. Prices, taxes, and the date_planned follow Odoo's normal onchange/compute behavior unless your file supplies an explicit override; analytic distribution and per-line descriptions are honored; and everything runs through ir.model.access.csv plus any record rules already in place, so a user who cannot edit purchase orders cannot import into them. We wire the views in XML (with OWL where the version calls for it), keep the manifest clean in __manifest__.py, and ship the same feature tuned to whichever release you run — 17.0, 18.0, or 19.0 — accounting for Community versus Enterprise field differences where relevant.

Because it is build-to-order, nothing downloads instantly. After a short scoping call we confirm the exact file formats, column map, product-matching keys, and edge cases your suppliers throw at you, then quote a fixed price and build against your Odoo version on a staging database. Typical delivery is one working week from confirmed scope, followed by UAT, go-live, and a support window. Pricing starts from $999 (indicative, single-company base scope); multi-company setups, additional file layouts or supplier-specific templates, deeper localization, and large historical data-migration volumes increase the quoted scope.

What you get

  • Installable, version-matched module source code for your Odoo 17.0, 18.0, or 19.0 database
  • Installation and configuration on your environment, including access rights and mapping-profile setup
  • Technical documentation covering models, wizard flow, mapping configuration, and the manifest
  • End-user guide plus a live training session for your procurement team
  • UAT on a staging database with a documented rollback plan before production go-live
  • Post-go-live support window for defect fixes and questions
  • Git repository handover with full commit history and tagged release
  • Sample import templates and saved mapping profiles built from your real supplier files

Who this is for

Procurement / purchasing manager

Runs high-line-count RFQs and reorders from supplier spreadsheets and wants buyers to load an entire order in seconds instead of retyping, without losing tax, UoM, or pricelist logic.

Odoo administrator / internal IT

Owns the Odoo instance and needs a clean, upgrade-safe module scoped to their version and access rules, delivered with a git repo and docs rather than a one-off script that bypasses the ORM.

Operations lead at a distributor or importer

Handles container packing lists and long product manifests and needs reliable product matching by SKU or barcode with a clear error report for rows that do not match.

Finance / controller stakeholder

Cares that imported lines carry correct unit costs, taxes, and analytic distribution so downstream vendor bills and cost reporting stay accurate and auditable.

How Import Purchase Order Lines from CSV/Excel File Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
Fit to your suppliers' filesBuilt around your real column layouts and matching keysWhatever your team codes, if they have Odoo depthFixed format; you adapt your files to itNo line-level spreadsheet import on the PO form
Product matchingInternal ref, barcode, or supplier code, priority configurableDepends on the developer's designUsually one fixed keyManual selection per line
Row validationPer-row error report before any writeMust be built and tested deliberatelyOften minimal; may fail silentlyNot applicable
Respects taxes / UoM / pricelist logicRuns through standard line logicEasy to bypass and get wrongVaries by moduleCorrect, but manual entry
Access controlEnforced via `ir.model.access.csv` + record rulesOnly if the developer wires itGenerally standard rightsStandard Odoo rights
Odoo version fitBuilt and tuned for your 17/18/19 editionYou maintain version compatibilityDepends on vendor's version coverageAlways current
Support & handoverSupport window + git repo + docs + trainingIn-house knowledge onlyVendor ticket queue, genericCommunity/Enterprise support
Cost modelFixed quote after scoping, from $999 indicativeDeveloper time, open-endedLow list price, rigid scopeIncluded, but no feature

Frequently Asked Questions about Import Purchase Order Lines from CSV/Excel File

How long does delivery take?

Because this is build-to-order, it is not an instant download. After a scoping call to confirm your file formats, column map, and matching rules, typical delivery is one working week from confirmed scope. That includes building against your Odoo version, UAT on staging, and go-live.

How does pricing and scoping work?

Pricing starts from $999 as an indicative single-company base figure. We hold a short scoping call, confirm the exact requirements, then give you a fixed quote before any build begins. Multi-company setups, extra supplier templates, deeper localization, and large data-migration volumes increase the quoted scope.

What about support and Odoo updates?

Every build includes a post-go-live support window for defect fixes and questions. We build for your specific release (17.0, 18.0, or 19.0) and hand over the git repository so future upgrades are straightforward; we can also quote an ongoing maintenance arrangement for version migrations.

Which file formats and Odoo versions do you support?

The wizard handles `.csv`, `.xls`, and `.xlsx`, parsed server-side. We build and tune the same feature for Odoo 17.0, 18.0, and 19.0, on both Community and Enterprise, accounting for field differences between editions where relevant.

How are products matched from my file?

Rows match against internal reference (`default_code`), barcode, or the supplier product code on `product.supplierinfo`. We configure the match priority with you during scoping. Rows that do not match are reported per-row so a buyer can correct them, rather than being silently dropped.

Will imported lines keep correct taxes, prices, and units?

Yes. The import runs through Odoo's standard line logic, so taxes, `date_planned`, and unit-of-measure resolution behave as they would for a manually entered line. You choose whether to use the file's unit cost or let Odoo compute price from the vendor pricelist and `product.supplierinfo`.

Does it bypass our Odoo access rights?

No. The import wizard is governed by `ir.model.access.csv` and any existing record rules. A user who cannot edit purchase orders cannot import lines into them, and every import writes an audit note to the order chatter.

Request a quote

Import Purchase Order Lines from CSV/Excel File

A build-to-order Odoo module that lets your buyers upload a CSV or Excel file and drop dozens or hundreds of validated lines straight onto a purchase order. ECOSIRE builds, installs, and supports it for Odoo 17, 18, and 19.

  • Import action button on the `purchase.order` form that opens a `TransientModel` upload wizard, appending lines to the order in place
  • Accepts `.csv`, `.xls`, and `.xlsx` uploads, parsed server-side via Python `csv` plus `openpyxl`/`xlrd` with encoding and delimiter detection
  • Interactive column-mapping step that binds spreadsheet headers to `purchase.order.line` fields, with reusable saved mapping profiles per supplier
  • Product matching by internal reference (`default_code`), barcode, or supplier product code on `product.supplierinfo`, with configurable match priority

Request a Quotation

Tell us about your Import Purchase Order Lines from CSV/Excel File requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.