通过 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
下面的代码是当我在 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