1. 程式人生 > 實用技巧 >odoo 匯入檔案xml製作,使用csv 檔案製作xml 檔案

odoo 匯入檔案xml製作,使用csv 檔案製作xml 檔案

import csv
import random


class XmlFormat(object):
    def __init__(self):
        self.wf = open('data/res_location.xml', 'w', encoding='utf-8')
        self.add_header()

    def add_header(self):
        header = """<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data noupdate="1">
                """
        # print(header)
        self.wf.write(header)

    def add_tail(self):
        tail = """
        </data>
        </odoo>
                """
        self.wf.write(tail)

    def get_random(self):
        return random.randrange(1000, 9999, 1)

    def readfile(self):
        with open('data/location.csv', 'r', encoding='utf-8') as f:
            reder = csv.reader(f, delimiter=',')
            for i, line in enumerate(reder):
                if not line:
                    continue
                # todo: 自動抓取表頭資訊,並設定鍵值對:
                if i == 0:
                    # 儲存表頭欄位
                    if not line:
                        raise
                    header_line = line
                    continue
                data = {}
                # print(line)
                # 處理每一行的資料
                for e, var in enumerate(line):
                    # print(e,var,header_line[e])
                    if header_line[e] == 'new-code':
                        data[header_line[e]] = var or self.get_random()
                    elif header_line[e] == 'is_warehouse':
                        data[header_line[e]] = var or 0
                    else:
                        data[header_line[e]] = var

                if (i) % 1000 == 0:
                    # 關閉之前的檔案
                    self.add_tail()
                    self.wf.close()
                    self.wf = open('data/res_location.xml'.format(i), 'w', encoding='utf-8')
                    print('\'data/res_location{}.xml\','.format(i))
                    self.add_header()
                #     這裡傳遞引數的方式可以使用**kw
                self.generate_xml_code(**data)

    def generate_xml_code(self, **kwargs):
        """
        設定xml 模板,並生成相應的xml文字,
        大括號中的引數需要和csv 檔案的欄位資訊保持一致,如{extra_id} 對應csv 檔案中的extra_id欄位
        xml 模板按照可按照自己的需求進行更換.
        注: csv 檔案的欄位不能重複.
        :param kwargs:
        :return:
        """
        str_format = """
        <record id="{extra_id}" model="stock.location">
            <field name="name">{name}</field>
            <field name="usage">internal</field>
            <field name="is_warehouse">{is_warehouse}</field>
            <field name="active">1</field>
            <field name="company_id" ref="base.main_company"/>
            <field name="location_id" ref="{extra_id_parent}"/>
            <field name="barcode">{new-code}</field>
        </record>
        """
        res = str_format.format(**kwargs)
        self.wf.write(res)

    def __del__(self):
        self.add_tail()

        self.wf.close()


if __name__ == '__main__':
    a = XmlFormat()
    a.readfile()

說明:

  1. csv檔案需要放在data資料夾中,其實可以修改讀取檔案的位置