Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

[分享]销售订单从Excel导入模版



  • 本着开源共享的精神,现将我们已经用了很成熟的销售订单从Excel导入模版做成一个Demo模块共享给大家,搞懂了这个,其他的什么采购订单,员工信息之类的都可以用类似的方法完成.废话不多说,简要给大家介绍一下代码的含义:

    1.首先定义要上传的字段,为bin类型:

    <br />_columns={<br />&nbsp; &nbsp; &nbsp;  &#039;data&#039;:fields.binary(&#039;File&#039;), <br />}<br />
    



    2.然后在view里定义该字段并附件一个导入按钮:

    <br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;openerp&gt;<br />	&lt;data&gt;<br />		&lt;record id=&quot;rainsoft_order_form&quot; model=&quot;ir.ui.view&quot;&gt;<br />			&lt;field name=&quot;name&quot;&gt;rainsoft.order.form&lt;/field&gt;<br />			&lt;field name=&quot;model&quot;&gt;sale.order&lt;/field&gt;<br />			&lt;field name=&quot;inherit_id&quot; ref=&quot;sale.view_order_form&quot;/&gt;<br />			&lt;field name=&quot;arch&quot; type=&quot;xml&quot;&gt;<br />				&lt;xpath expr=&quot;//field[@name=&#039;order_line&#039;]&quot; position=&quot;before&quot;&gt;<br />				&nbsp; &lt;group&gt;<br />					&lt;group&gt;<br />						&lt;field name=&#039;data&#039;/&gt;<br />					&lt;/group&gt;					&nbsp; &nbsp; &nbsp; <br />					&lt;group&gt;				&nbsp; <br />						&lt;button name=&#039;import_file&#039; string=&#039;Import&#039; type=&#039;object&#039; class=&#039;oe_edit_only&#039; states=&quot;draft&quot; /&gt;<br />					&lt;/group&gt;<br />				&nbsp; &lt;/group&gt;<br />				&lt;/xpath&gt;<br />			&lt;/field&gt;<br />		&lt;/record&gt;<br />	&lt;/data&gt;<br />&lt;/openerp&gt;<br />
    



    3.在相应的py文件中定义对这个button处理的逻辑,也就是我们要进行读取Excel并写入订单行的代码:

    <br />def import_file(self,cr,uid,ids,context=None):<br />			for wiz in self.browse(cr,uid,ids):<br />					if not wiz.data:continue<br />			excel = xlrd.open_workbook(file_contents=base64.decodestring(wiz.data))<br />			sheets = excel.sheets()<br />			for sh in sheets:<br />					if sh.name:<br />							lines=&#91;]<br />							for row in range(1,sh.nrows):<br />									if sh.cell(row,1).value and sh.cell(row,5).value:<br />											product_no = int(str(sh.cell(row,1).value).strip().split(&#039;.&#039;)[0])<br />											product_amount=sh.cell(row,5).value<br />											product_price =sh.cell(row,6).value<br />											product_method=sh.cell(row,12).value<br />											if product_method == u&#039;订单&#039;:<br />													product_method=&#039;make_to_order&#039;<br />											else:<br />													product_method=&#039;make_to_stock&#039;<br />				&nbsp; &nbsp; <br />											products = self.pool.get(&#039;product.product&#039;).search(cr,uid,[(&#039;default_code&#039;,&#039;=&#039;,product_no)],context=context)<br />											_logger.info(&quot;importing product_no:&quot;+str(product_no)+&quot;;products:&quot;+str(products))<br />											if len(products)&gt;0 and product_amount&gt;0 and product_amount:<br />													product = self.pool.get(&#039;product.product&#039;).browse(cr,uid,products[0],context=context)<br />													line={<br />															&#039;order_id&#039;:ids[0],<br />															&#039;name&#039;:product.name,<br />															&#039;product_id&#039;:product.id,<br />															&#039;price_unit&#039;:product_price,<br />															&#039;product_uom&#039;:product.uom_id.id,<br />															&#039;product_uom_qty&#039;:product_amount,<br />												&#039;type&#039;:product_method,<br />												&#039;state&#039;:&#039;draft&#039;,<br />															}<br />													self.pool.get(&#039;sale.order.line&#039;).create(cr,uid,line,context)<br />											else:<br />													_logger.info(&quot;product insert failed. No:&quot;+str(product_no))<br />													_logger.info(&quot;probably caused by 1.len(products):&quot;+str(len(products))+&quot;,2.product_amount:&quot;+str(product_amount))<br />									else:<br />											_logger.info(&#039;row 1 and row 5 is invalid! Error Column 1:&#039;+str(sh.cell(row,1).value)+&quot;;Error Column 2:&quot;+str(sh.cell(row,5).value))<br />
    



    导入Excel这里用到的是xlrd库,效果见附件图

    Demo地址(附带Excel文件):https://github.com/kevin8909/sale_from_excel



  • OE现有的 csv 导入已经做得相当不错了..

    建议 将 xls 文件导入部分hook到 csv 文件导入中去....



  • [quote author=mrshelly link=topic=16663.msg29199#msg29199 date=1413851267]
    OE现有的 csv 导入已经做得相当不错了..

    建议 将 xls 文件导入部分hook到 csv 文件导入中去....
    [/quote]

    但是csv文件的导入对业务人员来说太不友好,这样只是为了方便业务人员的日常操作.



  • 同意楼主的意见,从操作上考虑,确实是直接以Excel导入到系统最好,用户的接受度比较高,值得推荐。
    感谢分享。