通过 Python 脚本在 Odoo 中导入 xlsx 文件

Import xlsx files in Odoo via Python script

下面的代码是当我在 Odoo 中按下导入产品按钮时执行的函数。此脚本从 csv 文件导入 Odoo 中的产品。可以先上传 csv 文件,然后单击导入按钮。 我不能做的是,当我上传 xlsx 文件并单击导入时,我收到警告该文件无效。 有人可以帮我如何启用从 xlsx 文件导入吗?

@api.one
def action_import(self):
    ctx = self._context
    data = base64.b64decode(self.data)
    file_input = cStringIO.StringIO(data)
    file_input.seek(0)
    row = []
    result = {}
    if self.delimeter:
        delimeter = str(self.delimeter)
    else:
        delimeter = ','
    fieldnames = ['supplier_default_code', 'name', 'product_brand', 'supplier', 'standard_price', 'list_price',
                  'internal_category', 'spare_part', 'service_part', 'default_code', 'supplierinfo_product_name',
                  'rrp_price', 'min_qty', 'weight', 'net_weight', 'volume', 'height', 'width', 'depth', 'delay',
                  'warranty_type', 'warranty', 'sale_delay', 'description', 'description_sale',
                  'description_delivery', 'ean']
    reader = csv.DictReader(file_input, delimiter=delimeter, fieldnames=fieldnames)
    try:
        row.extend(reader)
    except Exception:
        raise exceptions.Warning(_("Not a valid file!"))
    keys = row[0]
    self.create_products_from_array(row)

根据您的描述,您似乎希望 csv.DictReader 处理 .xlsx 文件。但这与 .csv 文件完全不同。 Excel 可以同时打开它们的事实并不意味着它们可以互换,或者以某种方式相同。

您可以尝试使用模块 xlrd。但这将是一个完全不同的实现;该模块不会提供 csv.DictReader.

的直接替换

唯一的其他选择是预处理 .xlsx 文件并将其转换为您的代码期望的 .csv。您可以为此使用 xlrd,或者您可以在 Excel 中编写一个 VBA 宏来执行此操作;事实上,可能有十几种方法可以做到。

你可以尝试实现这段代码,来源XLS to Dict Reader using xlrd

try
    import xlrd

    def XLSDictReader(f, sheet_index=0):
        data    = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
        book    = xlrd.open_workbook(file_contents=data)
        sheet   = book.sheet_by_index(sheet_index)

        def item(i, j):
            return (sheet.cell_value(0,j), sheet.cell_value(i,j))

        return ( dict(item(i,j) for j in range(sheet.ncols)) \
                 for i in range(1, sheet.nrows) )

except ImportError:
XLSDictReader = None