跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. [分享]销售订单从Excel导入模版

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

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
5 帖子 3 发布者 5.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • KevinKongK 离线
    KevinKongK 离线
    KevinKong
    写于 最后由 编辑
    #1

    本着开源共享的精神,现将我们已经用了很成熟的销售订单从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

    1 条回复 最后回复
    0
    • mrshellyM 离线
      mrshellyM 离线
      mrshelly
      写于 最后由 编辑
      #2

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

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

      1 条回复 最后回复
      0
      • KevinKongK 离线
        KevinKongK 离线
        KevinKong
        写于 最后由 编辑
        #3

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

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

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

        1 条回复 最后回复
        0
        • K 离线
          K 离线
          kennypan
          写于 最后由 编辑
          #4

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

          1 条回复 最后回复
          0

          • 登录

          • 没有帐号? 注册

          • 登录或注册以进行搜索。
          • 第一个帖子
            最后一个帖子
          0
          • 版块
          • 标签
          • 热门
          • 用户
          • 群组