Odoo 12使用py3o_report打印docx等格式时出现FileNotFoundError求助
嘿,我来帮你解决这个Odoo py3o_report生成docx报错的问题!从你描述的情况来看,生成.odt正常但docx找不到/tmp里的文件,大概率是docx格式转换依赖缺失或者配置/权限问题,结合你的代码,我整理了几个排查方向和修复步骤:
1. 检查py3o生成docx的核心依赖是否安装
py3o_report生成docx格式需要依赖LibreOffice(或OpenOffice)以及unoconv工具——这俩是用来把ODT模板转换为DOCX的关键。如果没装这些依赖,系统根本完不成转换,自然会出现/tmp里找不到生成文件的情况。
- 以Ubuntu系统为例,安装LibreOffice:
sudo apt-get install libreoffice - 安装unoconv:
sudo apt-get install unoconv - 测试依赖是否可用:在Odoo服务器上手动执行
unoconv --version,能正常输出版本信息就说明没问题
2. 修正你的Report配置代码
你的代码里先定义了一个report_type="qweb-pdf"的报表,接着又在ir.actions.report里修改为py3o类型,这种重复定义很容易导致配置冲突。建议直接统一成下面的写法:
<odoo> <record id="my_module.action_report_hr_expense" model="ir.actions.report"> <field name="name">Expense</field> <field name="model">hr.expense</field> <field name="report_type">py3o</field> <field name="py3o_filetype">docx</field> <field name="module">my_module</field> <field name="py3o_multi_in_one">True</field> <!-- 确保这个odt模板确实存在于你的模块或依赖模块中 --> <field name="py3o_template_fallback">hr_expense.odt</field> </record> </odoo>
- 删掉原来的
<report>标签,直接用ir.actions.report记录定义报表,避免类型冲突 - 确认
py3o_template_fallback指向的hr_expense.odt模板路径和文件名完全正确
3. 检查/tmp目录的权限
Odoo运行的用户(比如默认的odoo用户)得有读写/tmp目录的权限。你可以用下面的命令排查:
# 查看/tmp的权限设置 ls -ld /tmp # 查看Odoo进程的运行用户 ps aux | grep odoo
一般来说/tmp默认是777权限,但如果你的系统做了权限限制,就得调整/tmp权限,或者确保Odoo用户属于有权限的用户组。
4. 启用py3o调试日志定位细节问题
要是上面的步骤还没解决,你可以在Odoo配置文件里开启py3o的调试日志,看看具体的错误信息:
在odoo.conf里添加:
log_level = debug log_handler = py3o.report:DEBUG
重启Odoo后再尝试打印报表,日志里会输出转换过程的细节,能帮你精准定位问题(比如LibreOffice调用失败的具体原因)
按照这些步骤排查,应该能解决你遇到的docx生成问题。
内容的提问来源于stack exchange,提问作者m0r7y




