# Import terms from a spreadsheet

To create many terms at once, import them from a CSV, XLS or XLSX file. This article shows you how to prepare the file in your spreadsheet, match its columns and read the report.

## Before you start

- The import creates the terms of a category, for example two hundred cities or all the brands of a catalog. It is offered only on the list of a category. It never updates a term that exists.
- A member who can edit content can import. The **Administrator** role is not required.
- The fields and references of the type must exist before the import. A field is created in the **Content types** menu, never from the import. [Add fields to a type](https://lovelyrender.com/documentation/add-content-fields/) describes this step.

## Prepare your file

1. Open the list of the category, for example **Cities**, in the menu of the type that cites it.
2. Click **Import**, next to the add button. The **Import entries** window opens.
3. Click **Download template (.csv)**. You receive the file `entries-import-template.csv`.
4. Open it in your spreadsheet. It has one column per language of the site, the main language first. The header of each column is the code of its language, for example `fr` or `en`.
5. Write one term per row, its title in each language. Add one column per field or reference to fill in, for example `Latitude`.
6. Save the file as CSV, XLS or XLSX.

![The Import entries window opened on the Cities list: the Download the template (.csv) button, then the Drag your file here area, or Choose a file.](https://static.lovelyrender.com/uploads/2026/10/961-doc-types-import-fenetre.png)

The downloaded file starts with the line `sep=;`. With it, Excel opens the file in columns whatever its regional setting. The import ignores this line.

| Element | Rule |
| --- | --- |
| Header row | Required. The import matches each column by its header, never by its position: the order of the columns is free. |
| Language column | Its header is the code of the language (`fr`, `fr_FR` or `fr-FR`) or its full name in its own language (`français (France)`). Capitalization does not matter. |
| Title | A row without a title, neither in a language nor in a column sent to **Entry title**, is skipped. An empty title cell does not create that language, except the main language when a column goes to **Entry title**. |
| Field value | Written in all the languages of the term: the latitude of a city is the same everywhere. |
| Reference | The title or the slug of the linked content, never an identifier. Several contents in one cell are separated by commas. A reference that accepts only one keeps the first. |
| Empty cell | Writes nothing. |

## Import the file

1. In the **Import entries** window, drag your file onto the **Drag your file here** area or click **Choose a file**. The message **Reading file…** appears.
2. Under **Detected columns**, check the language of each title column. Under **First rows of the file**, check the titles of the first five rows.
3. Under **Columns that are not a language**, choose in the **Goes to** list the destination of each column: a field, a reference, **Entry title** or **Ignore this column**.
4. Read the announced number. It is the number of terms the import will create: one per row and per language whose title is filled in. For two hundred filled rows in three languages, the window shows **600 entries will be created, languages included.**
5. Click the **Import 600 entries** button, which repeats the announced number. The message **Creating…** appears. At 0, the button stays grayed out: send a column to **Entry title**.
6. Read the report, then click **Close and refresh**. The list shows the terms created.

![The villes.csv file dropped in: the fr and en columns detected, the first five rows from Rezé to Carquefou with their latitudes, longitudes and postal codes, then the Latitude, Longitude and Postal code columns proposed on the fields of the same name. At the bottom, the sentence 25 entries will be created, languages included, and the Import 25 entries button.](https://static.lovelyrender.com/uploads/2026/10/964-doc-types-import-correspondance.png)

Nothing is created before you click the import button. A column whose header resembles the name or key of a field is proposed on that field. The import ignores accents, capitals and spaces: `LATITUDE` lands on the Latitude field. You confirm each column.

A site language without a column is flagged with **No column for these site languages:** followed by its codes. The import still runs, without that language.

**Note:** The preview stays valid for ten minutes. A click on the import button after that shows **The preview has expired. Upload the file again.**

## Import a file with no language column

A file whose column of names is called `Name`, for example, has no language column. In the **Goes to** list of that column, choose **Entry title**. Each row whose name is filled in creates a term in the main language of the site. The announced number and the button update, and the main language leaves the list of languages without a column.

**Entry title** is also useful when the file has language columns: it gives the title in the main language to the rows that have no title in that language.

![The communes.csv file dropped in, with no language column: its first five rows, the Name column sent to Entry title, Latitude and Longitude on their fields, then the note No column for these site languages: EN. At the bottom, the sentence 6 entries will be created, languages included, and the Import 6 entries button.](https://static.lovelyrender.com/uploads/2026/10/968-doc-types-import-titre.png)

## Read the report

One row of the file creates one term per language. These terms are linked together as translations. Each term created receives its language.

- A complete term is published.
- A term with an empty required field stays a draft. The status is decided language by language: the French version can be published while the English one stays a draft.
- A row without a title is skipped.

The report starts with **Import finished** and the total, for example **Published: 23. Draft: 2. Skipped: 1.** One line per special case follows, for example **Row 11: “Couëron” left as a draft because Latitude is missing.** Complete these drafts in the editor, then publish them.

![The report of the villes.csv import: Import complete, 23 published, 2 drafts and 1 skipped. Then the two versions of Couëron left as drafts for lack of a latitude, row 12 skipped for lack of a title, then the Close and refresh button.](https://static.lovelyrender.com/uploads/2026/10/971-doc-types-import-compte-rendu.png)

The sitemap.xml is rebuilt at the end of the import. The history of the site keeps a single line for the import, with the number of terms created.

**Note:** Terms published by the import are published in Staging. They go live at the next publication of the site.

## Fix a reading error

| Message | Fix |
| --- | --- |
| **The file could not be read. Use CSV, XLS or XLSX.** | Save the file in one of these formats. |
| **The file contains no data rows.** | Add at least one row under the header row. |
| **The header row is empty. Write a language code or a name above each column.** | Write the code of a site language as the header, for example `fr`, or the name of each column. |

A title column whose header is misspelled, for example `French`, is not recognized as a language. It appears under **Columns that are not a language**: correct its header and upload the file again, or send it to **Entry title** if it is the main language.

## See also

- [Sort with a category](https://lovelyrender.com/documentation/sort-with-category/)
- [Add fields to a type](https://lovelyrender.com/documentation/add-content-fields/)
- [Link your content together](https://lovelyrender.com/documentation/link-contents/)
- [Add a language](https://lovelyrender.com/documentation/add-language/)
