导出和导入数据

从 Odoo 导出数据

使用数据库时,有时必须将数据导出到不同的文件类型。 这样做可以帮助您对活动进行报告(即使Odoo 的每个应用程序都提供了精确而简单的报告工具)。

使用Odoo,您可以导出记录中任何字段的信息。 为此,在需要导出的项目上激活列表视图,单击 操作 ,然后单击 导出

view of the different things to enable/click to export data

很简单,此操作仍具有一些特殊情况。 实际上,当单击 导出 时,会出现一个弹出窗口,其中包含用于导出数据的多个选项:

overview of all the options to take into account when exporting data in Odoo
  1. 选中 我想更新数据 选项,系统仅显示可以导入的字段。 如果您想更新现有记录,这将非常有用。 基本上,这就像一个过滤器。 取消选中该框会提供更多的字段选项,因为它会显示所有字段,而不只是可以导入的字段。

  2. 导出时,可以选择两种格式:.csv 和 .xls。 使用 .csv,项目以逗号分隔,而.xls 包含有关文件中所有工作表的信息,如内容和格式。

  3. 这些是您可能要导出的项目。 使用箭头显示更多子字段选项。 当然,您可以使用搜索栏更轻松地查找特定字段。 要更有效地使用搜索选项,请单击所有箭头以显示所有字段!

  4. The + button is there to add fields to the “to export” list.

  5. 所选字段旁边的“控点”允许您上下移动字段,以更改它们在导出文件中的显示顺序。

  6. 如果您需要删除字段,则可以点击垃圾箱图标。

  7. 对于定期报告,保存导出预设可能很有用。 选择所有需要的选项,然后单击模板栏。 在这里,单击 新模板 ,并起一个名字。 下次您需要导出相同列表时,只需选择相关模板。

小技巧

请牢记字段的外部标识符。 例如,相关公司 等于 parent_id 。 这样做可只导出您接下来要导入的内容。

将数据导入 Odoo

如何开始

可使用Excel (.xlsx) 或CSV (.csv) 格式导入Odoo业务对象的任何数据:联系人、产品、银行对账单、日记账条目、甚至订单!

打开要填充的对象的视图,然后单击:menuselection:’收藏夹 –> 导入记录’。

../../_images/import_button.png

系统提供了模板,你可以轻松移植你自己的数据。只需点击一次即可导入这些模板。数据映射已经完成。

如何使用模板

  • 添加、删除或分类各行,使它们以最好的方式适应你的数据结构。

  • 建议不要删除 ID (原因见下节)

  • 将ID排序下拉,为每个记录设置一个独一无二的ID。

../../_images/dragdown.gif
  • 添加新一行时,如果这个行的标签与系统中任何字段均不匹配,Odoo可能不会自动将其映射。因此,请通过搜索查找对应的字段。

    ../../_images/field_list.png

    然后使用你在导入模板上找到的标签,下次尝试导入的时候即可马上使用。

如何从其他应用程序中导入

为了在不同的记录之间重新创建关系,需将初始应用中唯一的标识符映射到Odoo中的**ID**(外部ID)行。导入与第一个记录相链接的其他记录时,使用到这个唯一标识符的**XXX/ID** (XXX/外部 ID)。也可以通过名称找到这个记录,但如果有至少2条同名的记录,可能会影响你的查找。

如你需要稍后重新导入修改后的数据,也可用更新**ID**初始导入。这在任何时候都是一个不错的办法。

我找不到想要映射的行的区域

Odoo试图基于文件的前10行找到文件内部各行的区域类型。例如,有一个只包含数字的行,只有**整数**类型的区域才显示供你选择。尽管这种方式可能在多数情况下都很合适,但也有可能出错,或者你希望将这些行映射到默认没有规划的区域中。

这时,你只需选择**显示关系区域的区域(高级)**选项,为每一行选择完整的区域列表。

../../_images/field_list.png

在哪里修改数据导入格式?

Odoo可自动检测特定列是否为日期,并且它还将从一组最常用的日期格式中猜测使用的日期格式。尽管这一过程可用于很多日期格式,但某些日期格式却无法识别。月和日倒置可能引起混淆;对于“01-03-2016”这样的格式,我们很难判断哪部分代表月份,哪部分代表日。

要查看Odoo从你的文档中找到了哪些日期格式,可以在文档选择器下方的 选项 中点击 日期格式 。如果格式错误,你可以用 ISO 8601 修正格式。

注解

如你导入一个Excel(.xls, .xlsx)文件,可使用日期单元格存放日期(因为在Excel中日期的显示与存储方式不一致)。这样当你在Odoo中找到一个日期就可以确保它是正确的格式。

我可以导入带有货币符号的数字(如:$32.00)吗?

是的,我们完全支持用带圆括号的数字代表负数,以及带货币符号的数字。Odoo还可自动识别你使用的千分位分隔符、小数点(稍后可在 选项 中修改)。如Odoo不能识别你使用的货币符号,则该字段不会被识别为数字,可能导致出错。

支持的数字格式示例(如三万二千):

  • 32.000,00

  • 32000,00

  • 32,000.00

  • -32000.00

  • (32000.00)

  • $ 32.000,00

  • (32000.00 €)

不合要求的例子:

  • ABC 32.000,00

  • $ (32.000,00)

如果我导入的预览表无法正确显示该怎么办?

默认导入预览是用逗号作为字段分隔符,引号作为文本分隔符。如你的CSV文件没有这些设置,可以修改文件格式选项(你选择文件后,在浏览CSV文件块下显示)。

请注意,如果你的CSV文件将表格作为分隔符,Odoo将不能判断这整种分隔关系。你需要在电子表格的格式选项中更改设置。见下面的问题。

保存我的电子表格应用时,如何更改CSV文件格式选项?

如果你在电子表格应用程序中编辑和保存CSV文件,分隔符将应用你的计算机的地区设置。我们建议你使用OpenOffice或LibreOffice Calc,因为它们允许修改全部三个选项( ‘另存为’对话框 ‣ 勾选’编辑筛选设置’ ‣ 保存)。

微软Excel在保存时只允许修改编码( ‘另存为’对话框 ‣ 点击’工具’下拉列表‣ 编码选项卡)。

数据库ID和外部ID的差别是什么?

某些字段定义了与另一个对象的关系。例如,联系人的国家与“国家”对象记录关联。如果你想导入这样的字段,Odoo必须重新创建不同记录之间的关联。为帮助你导入这样的字段,Odoo提供了三种机制。你必须在每个要导入的字段中使用且仅使用一种机制。

例如,在引用一个联系人的国别时,Odoo提供了三种不同的字段供你导入:

  • 国家:国家的名称或代码

  • 国家/数据库ID:用于记录唯一的Odoo ID,由postgresql 行定义。

  • 国家/外部ID:其他应用(或导入的.XML文档)中引用的记录ID

对于比利时这个国家,你可以用以下三种方式中之一进行导入:

  • 国家: 比利时

  • 国家/数据库ID:21

  • 国家/外部 ID: base.be

根据需要,你可以使用三种方式之一来引用关系中的记录。参照指引:

  • 使用国家:如果手动创建了CSV文件,则这是最快捷的导入方式。

  • 使用国家/数据库ID:你应该极少使用这一标识,主要是开发人员在使用。它的主要优势在于绝无冲突(你可能有多个相同的记录,但每个记录都有自己唯一的数据库ID)。

  • 使用国家/外部ID:从第三方应用中导入数据时,需要使用外部ID。

使用外部ID时,可利用带”外部ID”的行导入CSV文件,定义你导入的每条记录的外部ID号,然后引用类似”字段/外部ID”的记录。以下两个CSV文件是产品及目录的例子。

:d ownload:“用于类别<export_import_data/External_id_3rd_party_application_product_categories.csv>的 CSV 文件”。

:d ownload:“产品<export_import_data/External_id_3rd_party_application_products.csv>的 CSV 文件”。

如果我有多对一的字段怎么做?

例如,你有两个带子名称的产品目录,”Sellable” (ie. “Misc. Products/Sellable” & “Other Products/Sellable”),你的确认被暂停了,但你仍然可以导入数据。不过我们建议你不要导入这些数据,因为它们可能都与产品目录列表 (“Misc. Products/Sellable”)中的第一个“可销售”目录相链接。我们建议你修改一个副本值或产品目录的层级。

不过,如果你不想更改产品目录的配置,我们建议你在“目录”字段使用外部ID。

如何导入多对多的关系字段(如一个顾客有多个tag)

这些tag可以用逗号分隔(中间无空格)。例如,如你想把顾客同时与“制造商”和“零售商”tag相链接,可以在CSV文件的同一行中编码”Manufacturer,Retailer”。

:d拥有:“制造商,零售商<export_import_data/m2m_customers_tags.csv>的CSV文件”

如何导入一对多的关系(例如多个订单行对应一个销售订单)?

如果你先导入包含多个订单行的销售订单;你需要在CSV文件中为每个订单行保留一个特定行。第一个订单行将按相对于订单的信息在同一行导入。所有其他订单行都需要一个额外的行,它在字段中没有相对于的订单的任何信息。例如,你可以根据演示数据导入某些报价的``purchase.order_functional_error_line_cant_adpat.CSV``文件。

:d拥有:“<export_import_data/purchase.order_functional_error_line_cant_adpat.csv>”提交一些报价”。

以下CSV文档显示如何用各自的采购订单行导入订单:

:d拥有量:“采购订单及其各自的采购订单行<export_import_data/o2m_purchase_order_lines.csv>”。

以下CSV文件显示如何导入顾客及其联系人:

:d拥有:“客户及其各自的联系人<export_import_data/o2m_customers_contacts.csv>”。

我可以导入多次相同的记录吗?

如果导入的文件包含“外部 ID”或“数据库 ID”列之一,则将修改已导入的记录,而不是创建这些记录。这非常有用,因为它允许您多次导入相同的CSV文件,同时在两次导入之间进行一些更改。Odoo将负责创建或修改每条记录,具体取决于它是否是新的。

此功能允许你使用Odoo的导入/导出工具修改批记录,非常适合电子表格应用。

如果没有为特别字段赋值会有什么后果?

如果没有在CSV文件中设定全部字段,Odoo会向未定义的字段分配默认值。但是如果你在CSV文件中设置了空值,Odoo会在该字段设置EMPTY值,不再分配默认的值。

如何从一个SQL应用中向Odoo导出/导入不同的表单?

如要从不同的表单中导入数据,应在各个记录间重新创建属于不同表单的关系(即:如你导入公司和人员数据,需要在每个人及其服务的公司间重新创建链接。)

如要管理表单之间的关系,你可使用Odoo的“外部ID”工具。一条记录的“外部ID”是指这条记录在其他应用程序中的唯一标识符。“外部ID”必须在所有对象的所有记录中具备唯一性,因此在“外部ID”前面加上应用程序或表单名称是很好的习惯。(如“company_1’”或“person_1”,而不仅仅只有“1”)

例如,假设您有一个 SQL 数据库,其中包含两个要导入的表:公司和个人。每个人都属于一家公司,因此您必须重新创建一个人与他工作的公司之间的联系。(如果你想测试这个例子,这里有一个:d ownload:’dump of this postgreSQL数据库<export_import_data/database_import_test.sql>’)

首先会导出全部公司及其”外部 ID”。在PSQL环境中写入以下命令:

> copy (select 'company_'||id as "External ID",company_name as "Name",'True' as "Is a Company" from companies) TO '/tmp/company.csv' with CSV HEADER;

这条SQL命令将创建以下CSV文件:

External ID,Name,Is a Company
company_1,Bigees,True
company_2,Organi,True
company_3,Boum,True

在PSQL环境中使用以下SQL命令为个人创建CSV文档并链接到对应的公司:

> copy (select 'person_'||id as "External ID",person_name as "Name",'False' as "Is a Company",'company_'||company_id as "Related Company/External ID" from persons) TO '/tmp/person.csv' with CSV

它将生成以下CSV文件:

External ID,Name,Is a Company,Related Company/External ID
person_1,Fabien,False,company_1
person_2,Laurence,False,company_1
person_3,Eric,False,company_2
person_4,Ramsy,False,company_3

从本文件可以看出,Fabien和Laurence在Bigees公司工作(company_1),Eric在Organi公司工作。人员与公司的关系通过公司的外部ID来确定。我们必须将表单名称作为“外部ID”的前缀,以免人员与公司的ID之间出现冲突(person_1和company_1在原始数据库中的ID都是1)。

两个未经修改的文件已经就绪并导入Odoo。导入这两个CSV文件后,有4个联系人、3个公司(前两个联系人服务于同一公司)。你必须首先导入公司,然后导入人员。

如何适配导入模板

导入工具中提供导入模板,适用于大多数数据(联系人、产品、银行对账单等)导入。可以用任何电子表格软件(如Microsoft Office, OpenOffice, Google Drive等)

如何自定义文件

  • 删除你不需要的行。建议不要删除*ID*1(原因如下)

  • 将ID排序下拉,为每个记录设置一个独一无二的ID。

    ../../_images/dragdown.gif
  • 添加新一行时,如果这个行的标签与系统中任何字段均不匹配,Odoo可能不会自动将其映射。因此,请通过搜索查找对应的字段。

    ../../_images/field_list.png

    然后使用你在导入模板上找到的标签,下次尝试导入的时候即可马上使用。

为什么要用ID行

**ID**(外部ID)是行项目独一无二的标识符。请使用之前的软件,平稳过度到Odoo。

导入数据时,ID号设置不是强制的,但会在很多情况下非常有用。

  • 更新导入:在不创建副本的情况下多次导入同一个文件;

  • 导入关系字段(见下文)

如何导入关系字段

Odoo对象总是与其他众多对象相关联(即产品与产品目录、产品属性、供应商等相关联)。为了导入这些关系,你需要首先从它们自己的列表菜单中导入相关对象的记录。

可以使用关联的记录或ID号导入。当两个记录的名称相同时需要ID号进行区分,即在行标题的末尾添加。” / ID”。(如产品属性:产品属性/属性 / ID)