# Tableau croisé dynamique

- Human documentation: [https://docs.univer.ai/fr-FR/guides/sheets/features/pivot-table](https://docs.univer.ai/fr-FR/guides/sheets/features/pivot-table)

- Agent Markdown: [https://docs.univer.ai/fr-FR/guides/sheets/features/pivot-table.md](https://docs.univer.ai/fr-FR/guides/sheets/features/pivot-table.md)

- Requested language: `fr-FR`

- Content language: `fr-FR`

- Documentation version: `1.2.0`

- Source: [sheets/features/pivot-table.fr-FR.mdx](https://github.com/dream-num/documentation/blob/dev/content/guides/sheets/features/pivot-table.fr-FR.mdx)

---

#### Package metadata

```json
{
  "mobile": true,
  "preset": [
    {
      "client": "@univerjs/preset-sheets-advanced",
      "locale": "@univerjs/preset-sheets-advanced/locales/fr-FR",
      "style": "@univerjs/preset-sheets-advanced/lib/index.css"
    }
  ],
  "plugins": [
    {
      "client": "@univerjs-pro/sheets-pivot",
      "facade": "@univerjs-pro/sheets-pivot/facade",
      "locale": "@univerjs-pro/sheets-pivot/locale/fr-FR"
    },
    {
      "client": "@univerjs-pro/sheets-pivot-ui",
      "locale": "@univerjs-pro/sheets-pivot-ui/locale/fr-FR",
      "style": "@univerjs-pro/sheets-pivot-ui/lib/index.css"
    }
  ],
  "license": true,
  "server": false
}
```

Les tableaux croisés dynamiques sont de puissants outils d’analyse qui permettent de synthétiser, d’analyser et de visualiser rapidement de grands volumes de données. Ils proposent différentes opérations et options de mise en forme pour faciliter la compréhension des données.

## Introduction

Les tableaux croisés dynamiques sont généralement utilisés pour :

* Synthétiser les données : ils permettent d’obtenir rapidement une vue d’ensemble des données.
* Analyser les données : ils aident à repérer des tendances et des relations.
* Explorer les données : ils facilitent la découverte de règles et de tendances.
* Visualiser les données : ils permettent de mieux les comprendre grâce à leur représentation visuelle.

Un tableau croisé dynamique comprend généralement les éléments suivants :

* Étiquettes de lignes : elles servent à regrouper les données.
* Étiquettes de colonnes : elles servent également à regrouper les données.
* Valeurs : elles servent à synthétiser les données.

Vous pouvez ajuster les étiquettes de lignes, les étiquettes de colonnes et les valeurs selon vos besoins afin de mieux analyser les données.

![Missing Locale](https://raw.githubusercontent.com/dream-num/documentation/dev/content/guides/sheets/features/pivot-table/pivot.png)

### Source de données

Dans Univer Sheets, la source de données d’un tableau croisé dynamique peut être une feuille de calcul ou une plage de données. Choisissez la source la mieux adaptée à votre analyse.
La première ligne de la source de données est utilisée par défaut comme étiquettes de colonnes ; les lignes restantes constituent les données. La source doit donc être aussi structurée que possible et comporter le moins possible de lignes ou de colonnes vides.
Pour chaque colonne, Univer détecte automatiquement le type de données afin d’assurer le bon fonctionnement du tableau croisé dynamique. Si une colonne contient des types de données différents, son type est défini par défaut sur chaîne de caractères.

Dans Univer Sheets, les tableaux croisés dynamiques réagissent automatiquement aux modifications des données. Dès que la source change, le tableau croisé dynamique est actualisé.

### Filtrage

Les tableaux croisés dynamiques permettent de filtrer les étiquettes de lignes et de colonnes. Ils proposent aussi un champ de filtre qui ne participe pas à la classification principale ni à la disposition des données synthétisées, mais qui permet néanmoins de filtrer les données.

Deux méthodes de filtrage sont disponibles :

* Filtrage par étiquette : il s’applique directement aux éléments de la dimension d’étiquette active. Dans une dimension « province », par exemple, vous pouvez exclure certaines provinces.
* Filtrage par valeur : il nécessite d’indiquer une dimension de valeur, puis filtre les résultats synthétisés du champ de valeur. Vous pouvez, par exemple, exclure les données dont le chiffre d’affaires est inférieur à 1 000.

### Tri

Le tri d’un tableau croisé dynamique ne s’applique qu’aux champs de lignes et de colonnes. Il peut être croissant ou décroissant et repose sur la méthode `localCompare`. D’autres méthodes de tri, comme le tri pinyin, seront prises en charge ultérieurement.

Deux méthodes de tri sont disponibles :

* Tri par étiquette : il s’applique directement aux éléments de la dimension d’étiquette active. Dans une dimension « province », par exemple, vous pouvez trier les provinces par nom.
* Tri par valeur : il nécessite d’indiquer une dimension de valeur, puis trie les résultats synthétisés du champ de valeur. Vous pouvez, par exemple, effectuer un tri selon le chiffre d’affaires.

### Agrégation

Les tableaux croisés dynamiques prennent en charge les 11 méthodes d’agrégation proposées par Excel : somme, nombre, nombre de données, moyenne, maximum, minimum, produit, écart type, variance, écart type de la population et variance de la population.

Ils prennent en charge plusieurs dimensions de valeur et permettent de personnaliser la zone de la dimension de valeur (position de la valeur) ainsi que sa position (indice de la valeur).

Cette logique de disposition étant complexe, seule la vue en tableau est actuellement disponible. D’autres vues seront ajoutées ultérieurement en fonction des besoins.

### Exploration détaillée

L’exploration détaillée permet de double-cliquer sur une cellule de la zone de valeurs d’un tableau croisé dynamique pour afficher les données détaillées correspondantes. Il devient ainsi plus facile de remonter jusqu’aux données d’origine.

### Regroupement

Les tableaux croisés dynamiques proposent une fonctionnalité de regroupement qui n’est pas encore prise en charge dans Univer Sheets.

Le regroupement peut prendre les formes suivantes :

* Regroupement par date : les dates sont regroupées par année, mois, jour, etc.
* Regroupement numérique : les valeurs numériques sont regroupées dans des plages définies.
* Regroupement d’éléments : les éléments sont regroupés selon des règles précises.

## Mode plugin

### Installation

#### npm

```bash
npm install @univerjs-pro/sheets-pivot @univerjs-pro/sheets-pivot-ui
```

#### pnpm

```bash
pnpm add @univerjs-pro/sheets-pivot @univerjs-pro/sheets-pivot-ui
```

#### yarn

```bash
yarn add @univerjs-pro/sheets-pivot @univerjs-pro/sheets-pivot-ui
```

#### bun

```bash
bun add @univerjs-pro/sheets-pivot @univerjs-pro/sheets-pivot-ui
```

### Utilisation

```typescript
import { UniverSheetsPivotTablePlugin } from '@univerjs-pro/sheets-pivot' // [!code ++]
import { UniverSheetsPivotTableUIPlugin } from '@univerjs-pro/sheets-pivot-ui' // [!code ++]
import SheetsPivotTableUIEnUS from '@univerjs-pro/sheets-pivot-ui/locale/en-US' // [!code ++]
import SheetsPivotTableEnUS from '@univerjs-pro/sheets-pivot/locale/en-US' // [!code ++]
import { LocaleType, mergeLocales, Univer } from '@univerjs/core'
import '@univerjs-pro/sheets-pivot-ui/lib/index.css' // [!code ++]
import '@univerjs-pro/sheets-pivot/facade' // [!code

const univer = new Univer({
  locale: LocaleType.EN_US,
  locales: {
    [LocaleType.EN_US]: mergeLocales(
      SheetsPivotTableEnUS, // [!code ++]
      SheetsPivotTableUIEnUS, // [!code ++]
    ),
  },
})
```

### Enregistrement des plugins

Le plugin de tableau croisé dynamique offre un enregistrement flexible adapté à différents cas d’usage. Deux modes répondent aux divers besoins de calcul.

**Enregistrement dans le processus principal uniquement**

Le plugin de tableau croisé dynamique peut être enregistré uniquement dans le processus principal. Ce mode convient aux tâches légères et aux opérations simples, et ne nécessite aucune configuration supplémentaire. Il suffit d’importer `UniverSheetsPivotTablePlugin`.

```typescript
univer.registerPlugin(UniverSheetsPivotTablePlugin)
univer.registerPlugin(UniverSheetsPivotTableUIPlugin)
```

**Enregistrement dans le processus principal et le processus worker**

Pour les scénarios qui exigent des performances élevées, le plugin peut être enregistré à la fois dans le processus principal et dans le processus worker. Il bénéficie alors d’une architecture multithread qui distribue efficacement les données et les calculs, ce qui réduit considérablement la charge du processus principal et améliore les performances globales.

Dans ce mode, le processus principal assure surtout la distribution des données, la synchronisation et le rendu, tandis que le processus worker se charge des calculs complexes. Sa mise en œuvre nécessite d’ajuster la configuration lors de l’enregistrement.

```typescript
// main process file
// Setting notExecuteFormula to true indicates that the main process does not perform calculations. It is only responsible for data distribution, synchronization, and rendering.
univer.registerPlugin(UniverSheetsPivotTablePlugin, { notExecuteFormula: true })
univer.registerPlugin(UniverSheetsPivotTableUIPlugin)

// web worker process file
// Setting notExecuteFormula to false indicates that the worker process performs the calculations.
univer.registerPlugin(UniverSheetsPivotTablePlugin, { notExecuteFormula: false })
```

Si vous disposez d’une licence commerciale Univer, consultez la page [Utiliser une licence dans le client](https://docs.univer.ai/fr-FR/server/license.md#in-plugin-mode) pour la configurer.

### Plugins et configuration

```typescript
interface IUniverSheetsPivotConfig {
  /**
   * Define the maximum number of items that can be displayed in a single pivot table field.
   * @default 1000
   */
  maxLimitItemCount?: number
}
```

## Prise en charge mobile

Configurez d’abord l’[éditeur mobile](https://docs.univer.ai/fr-FR/guides/sheets/getting-started/installation.md#mobile-support). Dans l’initialisation en mode plugin de cette page, remplacez les inscriptions de bureau ci-dessous par les exports mobiles des mêmes paquets **avant d’ouvrir un document**. Conservez modèles, styles, traductions et imports Facade ; n’enregistrez pas les deux variantes.

| Paquet                          | Inscription de bureau            | Inscription mobile                     |
| ------------------------------- | -------------------------------- | -------------------------------------- |
| `@univerjs-pro/sheets-pivot-ui` | `UniverSheetsPivotTableUIPlugin` | `UniverSheetsPivotTableMobileUIPlugin` |

## Mode prédéfini

La fonctionnalité de tableau croisé dynamique est incluse dans le preset `@univerjs/preset-sheets-advanced`, qui comprend également d’autres fonctionnalités avancées, comme le dessin et les filigranes.

### Installation

> [!NOTE]
> Le preset `UniverSheetsAdvancedPreset` de `@univerjs/preset-sheets-advanced` dépend du preset `UniverSheetsDrawingPreset` lors de l’exécution. Installez d’abord `@univerjs/preset-sheets-drawing`.

#### npm

```bash
npm install @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advanced
```

#### pnpm

```bash
pnpm add @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advanced
```

#### yarn

```bash
yarn add @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advanced
```

#### bun

```bash
bun add @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advanced
```

### Utilisation

```typescript
import { UniverSheetsAdvancedPreset } from '@univerjs/preset-sheets-advanced' // [!code ++]
import UniverPresetSheetsAdvancedEnUS from '@univerjs/preset-sheets-advanced/locales/en-US' // [!code ++]
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
import UniverPresetSheetsCoreEnUS from '@univerjs/preset-sheets-core/locales/en-US'
import { UniverSheetsDrawingPreset } from '@univerjs/preset-sheets-drawing' // [!code ++]
import UniverPresetSheetsDrawingEnUS from '@univerjs/preset-sheets-drawing/locales/en-US' // [!code ++]
import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'
import '@univerjs/preset-sheets-core/lib/index.css'
import '@univerjs/preset-sheets-drawing/lib/index.css' // [!code ++]
import '@univerjs/preset-sheets-advanced/lib/index.css' // [!code ++]

const { univerAPI } = createUniver({
  locale: LocaleType.EN_US,
  locales: {
    [LocaleType.EN_US]: mergeLocales(
      UniverPresetSheetsCoreEnUS,
      UniverPresetSheetsDrawingEnUS, // [!code ++]
      UniverPresetSheetsAdvancedEnUS, // [!code ++]
    ),
  },
  presets: [
    UniverSheetsCorePreset(),
    UniverSheetsDrawingPreset(), // [!code ++]
    UniverSheetsAdvancedPreset(), // [!code ++]
  ],
})
```

Si vous disposez d’une licence commerciale Univer, consultez la page [Utiliser une licence dans le client](https://docs.univer.ai/fr-FR/server/license.md#in-preset-mode) pour la configurer.

### Presets et configuration

```typescript
interface IUniverSheetsAdvancedPresetConfig {
  pivot?: Pick<IUniverSheetsPivotConfig, 'maxLimitItemCount'>
}

interface IUniverSheetsPivotConfig {
  /**
   * Define the maximum number of items that can be displayed in a single pivot table field.
   * @default 1000
   */
  maxLimitItemCount?: number
}
```

## Facade API

Vous trouverez les définitions de types complètes de la Facade API dans la [FacadeAPI](https://docs.univer.ai/fr-FR/reference/facade.md).

### Importation

> [!INFO: Remarque sur le mode plugin]
> Seul le mode plugin nécessite d’importer manuellement le package Facade. Le mode prédéfini inclut déjà le package Facade correspondant ; aucune importation supplémentaire n’est nécessaire.

```typescript
import '@univerjs-pro/sheets-pivot/facade'
```

### Ajouter un tableau croisé dynamique

La méthode [`FWorkbook.addPivotTable`](https://docs.univer.ai/fr-FR/reference/facade/workbook.md#addpivottable) permet d’ajouter un tableau croisé dynamique. En cas de réussite, elle renvoie l’instance `FPivotTable`.

```typescript
// should ensure the sheet range A1:G9 is not empty
const fWorkbook = univerAPI.getActiveWorkbook()
const unitId = fWorkbook.getId()
const fSheet = fWorkbook.getActiveSheet()
const subUnitId = fSheet.getSheetId()
const sheetName = fSheet.getSheetName()
const sourceInfo = {
  unitId,
  subUnitId,
  sheetName,
  range: {
    startRow: 0,
    startColumn: 0,
    endRow: 8,
    endColumn: 6,
  },
}
const anchorCellInfo = {
  unitId,
  subUnitId,
  row: 20,
  col: 8,
}
const fPivotTable = await fWorkbook.addPivotTable(sourceInfo, univerAPI.Enum.PositionTypeEnum.Existing, anchorCellInfo)
const pivotTableId = fPivotTable.getPivotTableId()
// add flag to avoid add pivot fields multiple times
let hasAdded = false
// the addPivotTable is async, you can add pivot fields after the pivot table is added
univerAPI.addEvent(univerAPI.Event.PivotTableRendered, (params) => {
  if (!hasAdded && params.pivotTableId === pivotTableId) {
    fPivotTable.addField(1, univerAPI.Enum.PivotTableFiledAreaEnum.Row, 0)
    fPivotTable.addField(1, univerAPI.Enum.PivotTableFiledAreaEnum.Value, 0)
    hasAdded = true
  }
})
```

### Obtenir un tableau croisé dynamique

La méthode [`FWorkbook.getPivotTableByCell`](https://docs.univer.ai/fr-FR/reference/facade/workbook.md#getpivottablebycell) permet d’obtenir une instance de tableau croisé dynamique à partir de sa cellule d’ancrage. Elle renvoie l’instance `FPivotTable` si la cellule cible appartient à un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const unitId = fWorkbook.getId()
const fSheet = fWorkbook.getActiveSheet()
const subUnitId = fSheet.getSheetId()

// get pivot table by the cell in FWorkbook.
const fPivotTable = fWorkbook.getPivotTableByCell(unitId, subUnitId, 0, 8)

// get pivot table by the cell in FWorksheet.
const pivotTable2 = fSheet.getPivotTableByCell(0, 8)
```

L’instance [`FPivotTable`](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md) fournit plusieurs méthodes permettant de manipuler le tableau croisé dynamique.

| Méthode                                                                                          | Description                                                       |
| ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- |
| [remove](https://docs.univer.ai/fr-FR/reference/facade/generic-pivot-table.md#remove)                                           | supprime le tableau croisé dynamique de l’instance                |
| [getConfig](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#getconfig)                       | renvoie la configuration, la plage source et la cellule d’ancrage |
| [addField](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#addfield)                         | ajoute un champ au tableau croisé dynamique                       |
| [removeField](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#removefield)                   | supprime un champ du tableau croisé dynamique                     |
| [updateFieldPosition](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#updatefieldposition)   | met à jour la position d’un champ                                 |
| [updateValuePosition](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#updatevalueposition)   | contrôle la position de ∑Valeur                                   |
| [setSubtotalType](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#setsubtotaltype)           | définit le type de sous-total du champ                            |
| [setLabelSort](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#setlabelsort)                 | définit le tri par étiquette du champ                             |
| [setLabelManualFilter](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#setlabelmanualfilter) | définit le filtre par étiquette du champ                          |
| [renameField](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#renamefield)                   | renomme le champ                                                  |
| [setValueFilter](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#setvaluefilter)                                   | définit le filtre par valeur                                      |
| [reset](https://docs.univer.ai/fr-FR/reference/facade/generic-pivot-table.md#reset)                                             | réinitialise les champs du tableau croisé dynamique               |
| [setFieldsConfig](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#setfieldsconfig)           | définit la configuration des champs                               |
| [getValueFilters](https://docs.univer.ai/fr-FR/reference/facade/pivot-table.md#getvaluefilters)           | obtient tous les filtres par valeur                               |

```typescript
class FPivotTable {
/**
 * @description Get the pivot table config by the pivot table id.
 * @typedef PivotTableConfig
 * @property {TargetInfo} targetCellInfo  The target cell info of the pivot table.
 * @property {SourceInfo} sourceRangeInfo The source data range info of the pivot table.
 * @property {boolean} isEmpty The pivot table is empty or not.
 * @property {object} fieldsConfig The snapshot of the pivot table fields config.
 * @returns {PivotTableConfig|undefined} The pivot table config or undefined.
 */
  getConfig(): IPivotTableConfig
  /**
   * @description Remove a pivot table from the workbook by pivot table id
   */
  async remove(): void
  /**
   *@description Add a pivot field to the pivot table.
   * @param {string|number} dataFieldIdOrIndex The data field id.
   * @param {PivotTableFiledAreaEnum} fieldArea The area of the field.
   * @param {number} index The index of the field in the target area.
   * @returns {boolean} Whether the pivot field is added successfully.
   */
  async addField(dataFieldIdOrIndex: string | number, fieldArea: PivotTableFiledAreaEnum, index: number): Promise<boolean>
  /**
   * @description Remove a pivot field from the pivot table
   * @param {string[]} fieldIds The deleted field ids.
   * @returns {boolean} Whether the pivot field is removed successfully.
   */
  async removeField(fieldIds: string[]): Promise<boolean>
  /**
   * @description Update the pivot table field position.
   * @param {string} fieldId - The moved field id.
   * @param {PivotTableFiledAreaEnum} area - The target area of the field.
   * @param {number} index - The target index of the field, if the index is bigger than the field count in the target area, the field will be moved to the last, if the index is smaller than 0, the field will be moved to the first.
   * @returns {boolean} Whether the pivot field is moved successfully.
   */
  async updateFieldPosition(fieldId: string, area: PivotTableFiledAreaEnum, index: number): Promise<boolean>
  /**
   * @description If there are multiple value fields in the pivot table, you can update the position of the value field, which only can be position in row or column.
   * @param {PivotTableValuePositionEnum} position - The position of the value field.
   * @param {number} index - The index of the value field.
   * @returns {boolean} Whether the pivot value field is moved successfully.
   */
  async updateValuePosition(position: PivotTableValuePositionEnum, index: number): Promise<boolean>
  /**
   * @description Set the pivot table subtotal type for value field, it only works for the value field.
   * @param {string} fieldId - The field id.
   * @param {PivotSubtotalTypeEnum} subtotalType - The subtotal type of the field.
   * @returns {boolean} Whether the pivot table subtotal type is set successfully.
   */
  async setSubtotalType(fieldId: string, subtotalType: PivotSubtotalTypeEnum): Promise<boolean>
  /**
   * @description Set the pivot table sort info.
   * @param {string} tableFieldId - The field id of the sort.
   * @param {PivotTableSortInfo} info - The sort info.
   * @typedef PivotTableSortInfo
   * @property {PivotDataFieldSortOperatorEnum} type The sort operator of the field items.
   * @returns {boolean} Whether the pivot table sort info is set successfully.
   */
  async setLabelSort(tableFieldId: string, info: IPivotTableSortInfo): Promise<boolean>
  /**
   * @description Set the pivot table filter.
   * @param {string} tableFieldId - The field id of the filter.
   * @param {string[]} items - The items of the filter.
   * @returns {boolean} Whether the pivot table filter is set successfully.
   */
  async setLabelFilter(tableFieldId: string, items: string[], isAll?: boolean): Promise<boolean>
  /**
   * @description Rename the pivot table field.
   * @param {string} fieldId - The field id.
   * @param {string} name - The new name of the field.
   * @returns {boolean} Whether the pivot table field is renamed successfully.
   */
  async renameField(fieldId: string, name: string): Promise<boolean>
  /**
   * @description Set the pivot table value filter. A value filter is used to filter the data based on the value of a field.
   * @param {string} fieldId - The field id of the filter. Only one value filer can be set for a field.
   * @param {Omit<IPivotTableValueFilter, 'type'>} filterInfo - The filter info. The undefined value will be removed from the old filter.
   * @typedef filterInfo
   * @property {valueGreaterThan} operator - The filter operator is used to compare the value of the field with the expected value.Currently, The following operators are supported: valueBetween, valueEqual, valueGreaterThan, valueGreaterThanOrEqual, valueLessThan, valueLessThanOrEqual,valueNotBetween,valueNotEqual.
   * @property {number} expected - The expected value.
   * @property {string} valueFieldId - The value field id.
   * @returns {boolean} Whether the pivot table value filter is set successfully.
   */
  async setValueFilter(fieldId: string, filterInfo: Omit<IPivotTableValueFilter, 'type'>): Promise<boolean>
  /**
   * @description Clear the fields by provided field area or clear all fields.
   * @param {PivotTableFiledAreaEnum} [resetArea] The area of the field to reset or undefined to reset all fields.
   * @returns {Promise<boolean>} Whether the pivot table fields are reset successfully.
   */
  reset(resetArea?: PivotTableFiledAreaEnum): Promise<boolean>
  /**
   * @description Set the pivot table fields config.It will add fields to the pivot table from provided config.Before setting the fields config, you should ensure the pivot table is empty to avoid the conflict.
   * @param {IPivotTableConfig['fieldsConfig']} config The pivot table fields config.
   * @returns {Promise<boolean>} Whether the pivot table fields config is set successfully.
   */
  setFieldsConfig(config: IPivotTableConfig['fieldsConfig']): Promise<boolean>
  /**
   * Get all value filters of the pivot table. In pivot table, the value filter must be applied in order.So the order of the value filter is important.
   * @returns {IValueFilterInfoItem[]} The value filter info list.
   */
  getValueFilters(): IValueFilterInfoItem[]
}
```

### Écouteurs d’événements

Vous trouverez les définitions complètes des types d’événements dans la page [Events](https://docs.univer.ai/fr-FR/reference/facade/events.md).

L’événement `univerAPI.Event.BeforePivotTableAdd` est déclenché avant l’ajout d’un tableau croisé dynamique.

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.BeforePivotTableAdd, (params) => {
  const { positionType, targetCellInfo } = params
  if (positionType === univerAPI.Enum.PositionTypeEnum.Existing && targetCellInfo.sheetName === 'Sheet 1') {
    // Cancel the pivot table adding operation
    params.cancel = true
    console.log(`The pivot table can't be added to the sheet ${targetCellInfo.sheetName}`)
  }
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableAdded` est déclenché après l’ajout d’un tableau croisé dynamique.

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableAdded, (params) => {
  const { positionType, targetCellInfo } = params
  if (positionType === univerAPI.Enum.PositionTypeEnum.Existing) {
    console.log('A pivot table created in an existing sheet')
    console.log(`
      The target sheet name is ${targetCellInfo.sheetName},
      the target row is ${targetCellInfo.row}, the target column is ${targetCellInfo.column}
    `)
  } else {
    console.log('A pivot table created in a new sheet')
  }
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.BeforePivotTableMove` est déclenché avant le déplacement d’un tableau croisé dynamique.

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.BeforePivotTableMove, (params) => {
  const { pivotTableId, targetCellInfo } = params
  if (pivotTableId === 'pivotTable1' && targetCellInfo.sheetName === 'Sheet 1') {
    // Cancel the move pivot table operation
    params.cancel = true
    console.log(`The pivot table can't be moved to the sheet ${targetCellInfo.sheetName}`)
  }
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableMoved` est déclenché après le déplacement d’un tableau croisé dynamique.

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableMoved, (params) => {
  const { pivotTableId, targetCellInfo, originTargetInfo } = params
  if (pivotTableId === 'pivotTable1') {
    console.log(`
      The pivot table moved from row: ${originTargetInfo.row} & column: ${originTargetInfo.column}
      to the sheet ${targetCellInfo.sheetName} row: ${targetCellInfo.row} & column: ${targetCellInfo.column}
    `)
  }
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableRendered` est déclenché après le rendu d’un tableau croisé dynamique.

```typescript
// import { unionPivotViewRange } from '@univerjs-pro/sheets-pivot';
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableRendered, (params) => {
  const { pivotTableId, rangeInfo } = params
  console.log(`The pivot table ${pivotTableId} has been rendered`)
  if (rangeInfo) {
    console.log(unionPivotViewRange(rangeInfo))
  }
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableRemoved` est déclenché après la suppression d’un tableau croisé dynamique.

```typescript
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableRemoved, (params) => {
  const { pivotTableId } = params
  console.log(`The pivot table ${pivotTableId} has been removed`)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldAdded` est déclenché après l’ajout d’un champ à un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldAdded, (params) => {
  const { pivotTableId, fieldId, fieldArea, fieldIndex } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting('fieldId')
  console.log(fieldSetting)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldRemoved` est déclenché après la suppression d’un champ d’un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldRemoved, (params) => {
  const { pivotTableId, fieldId } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting(fieldId)
  console.log(fieldSetting)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldMoved` est déclenché après le déplacement d’un champ dans un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldMoved, (params) => {
  const { pivotTableId, fieldId, fieldArea, fieldIndex } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting(fieldId)
  console.log(`The source name ${fieldSetting.sourceName} the display name ${fieldSetting.displayName}`)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldCollapseChanged` est déclenché après le développement ou la réduction d’une dimension dans un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldCollapseChanged, (params) => {
  const { pivotTableId, fieldId, isCollapsed } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting(fieldId)
  console.log(`The source name ${fieldSetting.sourceName} the display name ${fieldSetting.displayName}`)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldFilterChanged` est déclenché après le filtrage d’une dimension dans un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldFilterChanged, (params) => {
  const { pivotTableId, fieldId, filter } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting(fieldId)
  console.log(`The Checklist filter value is ${fieldSetting.filterInfo.checklist}`)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldSortChanged` est déclenché après le tri d’une dimension dans un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldSortChanged, (params) => {
  const { pivotTableId, fieldId, sort } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting(fieldId)
  console.log(`The sort info is ${fieldSetting.sortInfo}`)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableFieldSettingChanged` est déclenché après la modification du paramètre d’une dimension dans un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableFieldSettingChanged, (params) => {
  const { pivotTableId, fieldId, setting } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const fieldSetting = pivotTable.getFieldSetting(fieldId)
  console.log(`The source name ${fieldSetting.sourceName} the display name ${fieldSetting.displayName}`)
})

// Remove the event listener, use `disposable.dispose()`
```

L’événement `univerAPI.Event.PivotTableValuePositionChanged` est déclenché après la modification de la position d’une valeur dans un tableau croisé dynamique.

```typescript
const fWorkbook = univerAPI.getActiveWorkbook()
const disposable = univerAPI.addEvent(univerAPI.Event.PivotTableValuePositionChanged, (params) => {
  const { pivotTableId, valueId, position } = params
  const pivotTable = fWorkbook.getPivotTableById(pivotTableId)
  const valueSetting = pivotTable.getValueSetting(valueId)
  console.log(`The source name ${valueSetting.sourceName} the display name ${valueSetting.displayName}`)
})

// Remove the event listener, use `disposable.dispose()`
```

## Afficher les valeurs sous forme de

Utilisez `setShowDataAs()` sur un champ de valeurs pour afficher sa part du total d’une ligne, d’une colonne ou du total général, ou un écart par rapport à un élément de base. Le calcul affiché change sans remplacer les données sources. `getShowDataAs()` lit le réglage et `resetShowDataAs()` rétablit le calcul normal.

```ts
const valueId = fPivotTable.getFieldIdsByArea(
  univerAPI.Enum.PivotTableFiledAreaEnum.Value,
)[0]
if (valueId) {
  await fPivotTable.setShowDataAs(valueId, {
    type: univerAPI.Enum.PivotShowAsTypeEnum.percentOfGrandTotal,
  })
  console.log(fPivotTable.getShowDataAs(valueId))
}
```

`fPivotTable` désigne un tableau croisé existant. Utilisez l’ID d’un champ de valeurs, pas celui d’une colonne source ou d’un champ de lignes. Les modes d’écart et de cumul nécessitent aussi les paramètres du champ et de l’élément de base.

## Copier les tableaux croisés dynamiques avec une feuille

Lorsque le plugin de tableaux croisés dynamiques est enregistré, la duplication d’une feuille copie aussi ses tableaux croisés dynamiques et leur configuration de champs. Chaque copie reçoit un nouvel identifiant. Si la source se trouve sur la feuille copiée, la référence pointe vers la nouvelle feuille ; une source située sur une autre feuille ou un autre classeur conserve sa référence. Les copies participent à l’annulation et au rétablissement de la duplication de la feuille.

```ts
const workbook = univerAPI.getActiveWorkbook()
if (!workbook) throw new Error('No active workbook')

const copiedSheet = workbook.duplicateActiveSheet()
console.log(copiedSheet.getSheetName())
```
