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

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

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

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

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



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

    1.首先定义要上传的字段,为bin类型:
    [code]
    _columns={
          'data':fields.binary('File'),
    }
    [/code]

    2.然后在view里定义该字段并附件一个导入按钮:
    [code]
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
    <data>
    <record id="rainsoft_order_form" model="ir.ui.view">
    <field name="name">rainsoft.order.form</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">
    <xpath expr="//field[@name='order_line']" position="before">
      <group>
    <group>
    <field name='data'/>
    </group>      
    <group>  
    <button name='import_file' string='Import' type='object' class='oe_edit_only' states="draft" />
    </group>
      </group>
    </xpath>
    </field>
    </record>
    </data>
    </openerp>
    [/code]

    3.在相应的py文件中定义对这个button处理的逻辑,也就是我们要进行读取Excel并写入订单行的代码:
    [code]
    def import_file(self,cr,uid,ids,context=None):
    for wiz in self.browse(cr,uid,ids):
    if not wiz.data:continue
    excel = xlrd.open_workbook(file_contents=base64.decodestring(wiz.data))
    sheets = excel.sheets()
    for sh in sheets:
    if sh.name:
    lines=[]
    for row in range(1,sh.nrows):
    if sh.cell(row,1).value and sh.cell(row,5).value:
    product_no = int(str(sh.cell(row,1).value).strip().split('.')[0])
    product_amount=sh.cell(row,5).value
    product_price =sh.cell(row,6).value
    product_method=sh.cell(row,12).value
    if product_method == u'订单':
    product_method='make_to_order'
    else:
    product_method='make_to_stock'
       
    products = self.pool.get('product.product').search(cr,uid,[('default_code','=',product_no)],context=context)
    _logger.info("importing product_no:"+str(product_no)+";products:"+str(products))
    if len(products)>0 and product_amount>0 and product_amount:
    product = self.pool.get('product.product').browse(cr,uid,products[0],context=context)
    line={
    'order_id':ids[0],
    'name':product.name,
    'product_id':product.id,
    'price_unit':product_price,
    'product_uom':product.uom_id.id,
    'product_uom_qty':product_amount,
    'type':product_method,
    'state':'draft',
    }
    self.pool.get('sale.order.line').create(cr,uid,line,context)
    else:
    _logger.info("product insert failed. No:"+str(product_no))
    _logger.info("probably caused by 1.len(products):"+str(len(products))+",2.product_amount:"+str(product_amount))
    else:
    _logger.info('row 1 and row 5 is invalid! Error Column 1:'+str(sh.cell(row,1).value)+";Error Column 2:"+str(sh.cell(row,5).value))
    [/code]

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

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



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

    1.首先定义要上传的字段,为bin类型:
    [code]
    _columns={
          'data':fields.binary('File'),
    }
    [/code]

    2.然后在view里定义该字段并附件一个导入按钮:
    [code]
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
    <data>
    <record id="rainsoft_order_form" model="ir.ui.view">
    <field name="name">rainsoft.order.form</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">
    <xpath expr="//field[@name='order_line']" position="before">
      <group>
    <group>
    <field name='data'/>
    </group>      
    <group>  
    <button name='import_file' string='Import' type='object' class='oe_edit_only' states="draft" />
    </group>
      </group>
    </xpath>
    </field>
    </record>
    </data>
    </openerp>
    [/code]

    3.在相应的py文件中定义对这个button处理的逻辑,也就是我们要进行读取Excel并写入订单行的代码:
    [code]
    def import_file(self,cr,uid,ids,context=None):
    for wiz in self.browse(cr,uid,ids):
    if not wiz.data:continue
    excel = xlrd.open_workbook(file_contents=base64.decodestring(wiz.data))
    sheets = excel.sheets()
    for sh in sheets:
    if sh.name:
    lines=[]
    for row in range(1,sh.nrows):
    if sh.cell(row,1).value and sh.cell(row,5).value:
    product_no = int(str(sh.cell(row,1).value).strip().split('.')[0])
    product_amount=sh.cell(row,5).value
    product_price =sh.cell(row,6).value
    product_method=sh.cell(row,12).value
    if product_method == u'订单':
    product_method='make_to_order'
    else:
    product_method='make_to_stock'
       
    products = self.pool.get('product.product').search(cr,uid,[('default_code','=',product_no)],context=context)
    _logger.info("importing product_no:"+str(product_no)+";products:"+str(products))
    if len(products)>0 and product_amount>0 and product_amount:
    product = self.pool.get('product.product').browse(cr,uid,products[0],context=context)
    line={
    'order_id':ids[0],
    'name':product.name,
    'product_id':product.id,
    'price_unit':product_price,
    'product_uom':product.uom_id.id,
    'product_uom_qty':product_amount,
    'type':product_method,
    'state':'draft',
    }
    self.pool.get('sale.order.line').create(cr,uid,line,context)
    else:
    _logger.info("product insert failed. No:"+str(product_no))
    _logger.info("probably caused by 1.len(products):"+str(len(products))+",2.product_amount:"+str(product_amount))
    else:
    _logger.info('row 1 and row 5 is invalid! Error Column 1:'+str(sh.cell(row,1).value)+";Error Column 2:"+str(sh.cell(row,5).value))
    [/code]

    导入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导入到系统最好,用户的接受度比较高,值得推荐。
    感谢分享。


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待