VH Office Report
Populate Microsoft Word (.docx) and Excel (.xlsx) templates with Odoo data — export the original file and PDF.
Jinja2 syntax · loops & dynamic columns · amount-in-words · one-click from any record
What it does
Design your print templates directly in Microsoft Word or Excel — no QWeb, no HTML.
Drop in simple {{ placeholders }}, upload the file, and generate polished documents
from any Odoo record with a single click. Powered by docxtpl (Jinja2 in Word) and a native
openpyxl engine for Excel, it supports loops, conditions, dynamic columns, images of your
data, and locale-aware currency & amount-in-words — then converts to PDF via LibreOffice.
Requirements
Python libraries
Install on the server:
pip install docxtpl num2words openpyxl
System (for PDF export)
LibreOffice (soffice) must be installed on the server.
If it is not on PATH, set the system parameter
vh_office_report.soffice_path to its full path. DOCX/XLSX export works without it.
Odoo apps
Depends on base, web, mail (all standard).
The bundled sample templates target Sales (sale) — install it to try them,
but the module works with any model.
Compatible with Odoo.sh and On-Premise. PDF export needs LibreOffice, so it is not available on Odoo Online.
Key features
One module for both .docx and .xlsx — the engine is chosen by the file extension.
{{ object.partner_id.name }}, defaults, conditions {% if %}.Repeat table rows per line:
{%tr for line in object.order_line %} (Word) / {% for %} (Excel).Pivot-style columns generated from data:
{%tc%} (Word) / {% hc %} (Excel).| words (English) and | words_vi (Vietnamese), plus | currency.Export the original file or PDF; select several records to get a ZIP.
Every template adds itself to the record's Action menu automatically.
A Placeholders tab lists every field with a ready-to-copy placeholder.
How to use
1. Create a template
Office Reports → Templates → New. Give it a name, pick the model it applies to
(e.g. sale.order), upload your .docx or .xlsx file, and set an optional
output file name such as Contract-{{ object.name }}. The Placeholders tab lists
every field of the model with a copy-ready placeholder.
2. Write placeholders in Word / Excel
| Purpose | Placeholder |
|---|---|
| Field / nested field | {{ object.partner_id.name }} |
| Currency (company) | {{ object.amount_total | currency }} |
| Amount in words | {{ object.amount_total | words }} · | words_vi |
| Date & time | {{ object.date_order | date('%d/%m/%Y') }} · {{ datetime.now().year }} |
| Condition | {% if object.amount_total > 0 %}…{% else %}…{% endif %} |
| Table row loop (Word) | {%tr for line in object.order_line %} … {%tr endfor %} |
| Dynamic columns (Excel) | {% hc for c in cols %} … {% hc endfor %} |
| Call any record method | {{ object.currency_id.round(x) }} |
3. Generate from any record
Open a record → Action menu → “Print: <your template>” → choose Original (Word/Excel) or PDF → Generate. Select several records in the list first to download a ZIP of all documents.
From template to document
Design the file yourself in Word / Excel with plain {{ placeholders }} and {% loops %} — the module fills it with your record's data on one click. Below, the template you design (left) and the generated document (right).
Word contract — dynamic line-items table & amount in words
Excel quotation — repeating rows, working =SUM(), amount in words
Pivot report (Word) — columns generated dynamically per product category
Pivot report (Excel) — the same dynamic columns, as a native spreadsheet with {% hc %}
Bundled samples
On install, four ready-to-use templates for sale.order are created automatically
(open a Sales Order → Action to try them): Sales Contract (Word), Sales Quotation
(Excel), and Pivot by category in both Word and Excel — each demonstrating every placeholder style.
Need help?
Questions, bug reports, or feature requests — email us and we'll reply within one business day.
Support: vuhaiqn90@gmail.com
Please include your Odoo version and the template file (.docx / .xlsx) if your question is about a specific document.
License: OPL-1 · 365-day support · lifetime updates within the purchased version.
Author: Uv Iah
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
Discuss (mail)
|
| Lines of code | 530 |
| Technical Name |
vh_office_report |
| License | OPL-1 |
| Website | https://apps.odoo.com |
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module